mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 增加 IndexAttribute 特性,自动迁移索引,以及对应的 FluentApi 方法;
- 移除 ColumnAttribute.Unique 属性设置,改为 IndexAttribute 特性设置唯一键;
This commit is contained in:
		@@ -150,7 +150,8 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
                    if (tboldname == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        //创建表
 | 
			
		||||
                        sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( ");
 | 
			
		||||
                        var createTableName = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}");
 | 
			
		||||
                        sb.Append("CREATE TABLE IF NOT EXISTS ").Append(createTableName).Append(" ( ");
 | 
			
		||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
			
		||||
                        {
 | 
			
		||||
                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
			
		||||
@@ -162,14 +163,22 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
                            foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
			
		||||
                            sb.Remove(sb.Length - 2, 2).Append("),");
 | 
			
		||||
                        }
 | 
			
		||||
                        foreach (var uk in tb.Uniques)
 | 
			
		||||
                        {
 | 
			
		||||
                            sb.Append(" \r\n  CONSTRAINT ").Append(_commonUtils.QuoteSqlName(uk.Key)).Append(" UNIQUE(");
 | 
			
		||||
                            foreach (var tbcol in uk.Value) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
			
		||||
                            sb.Remove(sb.Length - 2, 2).Append("),");
 | 
			
		||||
                        }
 | 
			
		||||
                        sb.Remove(sb.Length - 1, 1);
 | 
			
		||||
                        sb.Append("\r\n) WITH (OIDS=FALSE);\r\n");
 | 
			
		||||
                        //创建表的索引
 | 
			
		||||
                        foreach (var uk in tb.Indexes)
 | 
			
		||||
                        {
 | 
			
		||||
                            sb.Append("CREATE ");
 | 
			
		||||
                            if (uk.IsUnique) sb.Append("UNIQUE ");
 | 
			
		||||
                            sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(createTableName).Append("(");
 | 
			
		||||
                            foreach (var tbcol in uk.Columns)
 | 
			
		||||
                            {
 | 
			
		||||
                                sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
			
		||||
                                if (tbcol.IsDesc) sb.Append(" DESC");
 | 
			
		||||
                                sb.Append(", ");
 | 
			
		||||
                            }
 | 
			
		||||
                            sb.Remove(sb.Length - 2, 2).Append(");\r\n");
 | 
			
		||||
                        }
 | 
			
		||||
                        //备注
 | 
			
		||||
                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -275,23 +284,32 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
 | 
			
		||||
                    var dsuksql = _commonUtils.FormatSql(@"
 | 
			
		||||
select
 | 
			
		||||
c.attname,
 | 
			
		||||
b.relname
 | 
			
		||||
b.relname,
 | 
			
		||||
case when pg_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc,
 | 
			
		||||
case when indisunique = 't' then 1 else 0 end IsUnique
 | 
			
		||||
from pg_index a
 | 
			
		||||
inner join pg_class b on b.oid = a.indexrelid
 | 
			
		||||
inner join pg_attribute c on c.attnum > 0 and c.attrelid = b.oid
 | 
			
		||||
inner join pg_namespace ns on ns.oid = b.relnamespace
 | 
			
		||||
inner join pg_class d on d.oid = a.indrelid
 | 
			
		||||
where ns.nspname in ({0}) and d.relname in ({1}) and a.indisunique = 't'", tboldname ?? tbname);
 | 
			
		||||
                    var dsuk = _orm.Ado.ExecuteArray(CommandType.Text, dsuksql).Select(a => new[] { string.Concat(a[0]), string.Concat(a[1]) });
 | 
			
		||||
                    foreach (var uk in tb.Uniques)
 | 
			
		||||
where ns.nspname in ({0}) and d.relname in ({1}) and a.indisprimary = 'f'", tboldname ?? tbname);
 | 
			
		||||
                    var dsuk = _orm.Ado.ExecuteArray(CommandType.Text, dsuksql).Select(a => new[] { string.Concat(a[0]), string.Concat(a[1]), string.Concat(a[2]), string.Concat(a[3]) });
 | 
			
		||||
                    foreach (var uk in tb.Indexes)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (string.IsNullOrEmpty(uk.Key) || uk.Value.Any() == false) continue;
 | 
			
		||||
                        var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Key, true) == 0).ToArray();
 | 
			
		||||
                        if (dsukfind1.Any() == false || dsukfind1.Length != uk.Value.Count || dsukfind1.Where(a => uk.Value.Where(b => string.Compare(b.Attribute.Name, a[0], true) == 0).Any()).Count() != uk.Value.Count)
 | 
			
		||||
                        if (string.IsNullOrEmpty(uk.Name) || uk.Columns.Any() == false) continue;
 | 
			
		||||
                        var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray();
 | 
			
		||||
                        if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => uk.Columns.Where(b => (a[3] == "1") == uk.IsUnique && string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (dsukfind1.Any()) sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(_commonUtils.QuoteSqlName(uk.Key)).Append(";\r\n");
 | 
			
		||||
                            sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD CONSTRAINT ").Append(_commonUtils.QuoteSqlName(uk.Key)).Append(" UNIQUE(");
 | 
			
		||||
                            foreach (var tbcol in uk.Value) sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
			
		||||
                            if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(";\r\n");
 | 
			
		||||
                            sbalter.Append("CREATE ");
 | 
			
		||||
                            if (uk.IsUnique) sbalter.Append("UNIQUE ");
 | 
			
		||||
                            sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("(");
 | 
			
		||||
                            foreach (var tbcol in uk.Columns)
 | 
			
		||||
                            {
 | 
			
		||||
                                sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
			
		||||
                                if (tbcol.IsDesc) sbalter.Append(" DESC");
 | 
			
		||||
                                sbalter.Append(", ");
 | 
			
		||||
                            }
 | 
			
		||||
                            sbalter.Remove(sbalter.Length - 2, 2).Append(");\r\n");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
@@ -325,12 +343,6 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
 | 
			
		||||
                    foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
			
		||||
                    sb.Remove(sb.Length - 2, 2).Append("),");
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var uk in tb.Uniques)
 | 
			
		||||
                {
 | 
			
		||||
                    sb.Append(" \r\n  CONSTRAINT ").Append(_commonUtils.QuoteSqlName(uk.Key)).Append(" UNIQUE(");
 | 
			
		||||
                    foreach (var tbcol in uk.Value) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
			
		||||
                    sb.Remove(sb.Length - 2, 2).Append("),");
 | 
			
		||||
                }
 | 
			
		||||
                sb.Remove(sb.Length - 1, 1);
 | 
			
		||||
                sb.Append("\r\n) WITH (OIDS=FALSE);\r\n");
 | 
			
		||||
                //备注
 | 
			
		||||
@@ -362,6 +374,20 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
 | 
			
		||||
                sb.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append(";\r\n");
 | 
			
		||||
                sb.Append("DROP TABLE ").Append(tablename).Append(";\r\n");
 | 
			
		||||
                sb.Append("ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName(tbname[1])).Append(";\r\n");
 | 
			
		||||
                //创建表的索引
 | 
			
		||||
                foreach (var uk in tb.Indexes)
 | 
			
		||||
                {
 | 
			
		||||
                    sb.Append("CREATE ");
 | 
			
		||||
                    if (uk.IsUnique) sb.Append("UNIQUE ");
 | 
			
		||||
                    sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(tablename).Append("(");
 | 
			
		||||
                    foreach (var tbcol in uk.Columns)
 | 
			
		||||
                    {
 | 
			
		||||
                        sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
			
		||||
                        if (tbcol.IsDesc) sb.Append(" DESC");
 | 
			
		||||
                        sb.Append(", ");
 | 
			
		||||
                    }
 | 
			
		||||
                    sb.Remove(sb.Length - 2, 2).Append(");\r\n");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var seqcol in seqcols)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user