- 优化 pgsql CodeFirst Syncsture CREATE INDEX code;

This commit is contained in:
2881099 2023-01-17 17:20:50 +08:00
parent 2ca2c8a8a6
commit 49cdfc4961
6 changed files with 45 additions and 21 deletions

View File

@ -84,11 +84,13 @@ namespace FreeSql.Custom.PostgreSQL
var sb = new StringBuilder(); var sb = new StringBuilder();
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列 var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
var isPg95 = true;
var isPg96 = true; var isPg96 = true;
var isPg10 = (_orm.DbFirst as CustomPostgreSQLDbFirst).IsPg10; var isPg10 = (_orm.DbFirst as CustomPostgreSQLDbFirst).IsPg10;
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
{ {
isPg96 = CustomPostgreSQLDbFirst.PgVersionIs96(conn.Value.ServerVersion); isPg95 = CustomPostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 5);
isPg96 = CustomPostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 6);
} }
foreach (var obj in objects) foreach (var obj in objects)
@ -156,7 +158,9 @@ namespace FreeSql.Custom.PostgreSQL
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -338,7 +342,9 @@ where ns.nspname in ({{0}}) and d.relname in ({{1}}) and a.indisprimary = 'f'",
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n"); if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n");
sbalter.Append("CREATE "); sbalter.Append("CREATE ");
if (uk.IsUnique) sbalter.Append("UNIQUE "); if (uk.IsUnique) sbalter.Append("UNIQUE ");
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("("); sbalter.Append("INDEX ");
if (isPg95) sbalter.Append("IF NOT EXISTS ");
sbalter.Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -433,7 +439,9 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));

View File

@ -542,12 +542,12 @@ where a.typtype = 'e' and ns.nspname in (SELECT ""schema_name"" FROM information
return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList(); return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList();
} }
public static bool PgVersionIs96(string serverVersion) public static bool PgVersionIs(string serverVersion, int version1, int version2 = 0)
{ {
int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray(); int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray();
if (version?.Any() != true) return true; if (version?.Any() != true) return true;
if (version[0] > 9) return true; if (version[0] > version1) return true;
if (version[0] == 9 && version.Length > 1 && version[1] >= 6) return true; if (version[0] == version1 && version.Length > 1 && version[1] >= version2) return true;
return false; return false;
} }
} }

View File

@ -85,11 +85,13 @@ namespace FreeSql.Odbc.PostgreSQL
var sb = new StringBuilder(); var sb = new StringBuilder();
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列 var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
var isPg95 = true;
var isPg96 = true; var isPg96 = true;
var isPg10 = (_orm.DbFirst as OdbcPostgreSQLDbFirst).IsPg10; var isPg10 = (_orm.DbFirst as OdbcPostgreSQLDbFirst).IsPg10;
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
{ {
isPg96 = OdbcPostgreSQLDbFirst.PgVersionIs96(conn.Value.ServerVersion); isPg95 = OdbcPostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 5);
isPg96 = OdbcPostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 6);
} }
foreach (var obj in objects) foreach (var obj in objects)
@ -157,7 +159,9 @@ namespace FreeSql.Odbc.PostgreSQL
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -339,7 +343,9 @@ where ns.nspname in ({{0}}) and d.relname in ({{1}}) and a.indisprimary = 'f'",
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n"); if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n");
sbalter.Append("CREATE "); sbalter.Append("CREATE ");
if (uk.IsUnique) sbalter.Append("UNIQUE "); if (uk.IsUnique) sbalter.Append("UNIQUE ");
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("("); sbalter.Append("INDEX ");
if (isPg95) sbalter.Append("IF NOT EXISTS ");
sbalter.Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -434,7 +440,9 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));

View File

@ -536,12 +536,12 @@ where a.typtype = 'e' and ns.nspname in (SELECT ""schema_name"" FROM information
return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList(); return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList();
} }
public static bool PgVersionIs96(string serverVersion) public static bool PgVersionIs(string serverVersion, int version1, int version2 = 0)
{ {
int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray(); int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray();
if (version?.Any() != true) return true; if (version?.Any() != true) return true;
if (version[0] > 9) return true; if (version[0] > version1) return true;
if (version[0] == 9 && version.Length > 1 && version[1] >= 6) return true; if (version[0] == version1 && version.Length > 1 && version[1] >= version2) return true;
return false; return false;
} }
} }

View File

@ -134,11 +134,13 @@ namespace FreeSql.PostgreSQL
var sb = new StringBuilder(); var sb = new StringBuilder();
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列 var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
var isPg95 = true;
var isPg96 = true; var isPg96 = true;
var isPg10 = (_orm.DbFirst as PostgreSQLDbFirst).IsPg10; var isPg10 = (_orm.DbFirst as PostgreSQLDbFirst).IsPg10;
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
{ {
isPg96 = PostgreSQLDbFirst.PgVersionIs96(conn.Value.ServerVersion); isPg95 = PostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 5);
isPg96 = PostgreSQLDbFirst.PgVersionIs(conn.Value.ServerVersion, 9, 6);
} }
foreach (var obj in objects) foreach (var obj in objects)
@ -206,7 +208,9 @@ namespace FreeSql.PostgreSQL
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -385,7 +389,9 @@ where ns.nspname in ({{0}}) and d.relname in ({{1}}) and a.indisprimary = 'f'",
if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n"); if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(";\r\n");
sbalter.Append("CREATE "); sbalter.Append("CREATE ");
if (uk.IsUnique) sbalter.Append("UNIQUE "); if (uk.IsUnique) sbalter.Append("UNIQUE ");
sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("("); sbalter.Append("INDEX ");
if (isPg95) sbalter.Append("IF NOT EXISTS ");
sbalter.Append(_commonUtils.QuoteSqlName(ukname)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
@ -480,7 +486,9 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp
{ {
sb.Append("CREATE "); sb.Append("CREATE ");
if (uk.IsUnique) sb.Append("UNIQUE "); if (uk.IsUnique) sb.Append("UNIQUE ");
sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("("); sb.Append("INDEX ");
if (isPg95) sb.Append("IF NOT EXISTS ");
sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tablename).Append("(");
foreach (var tbcol in uk.Columns) foreach (var tbcol in uk.Columns)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));

View File

@ -639,12 +639,12 @@ where a.typtype = 'e' and ns.nspname in (SELECT ""schema_name"" FROM information
return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList(); return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList();
} }
public static bool PgVersionIs96(string serverVersion) public static bool PgVersionIs(string serverVersion, int version1, int version2 = 0)
{ {
int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray(); int[] version = serverVersion.Split('.').Select(a => int.TryParse(a, out var tryint) ? tryint : 0).ToArray();
if (version?.Any() != true) return true; if (version?.Any() != true) return true;
if (version[0] > 9) return true; if (version[0] > version1) return true;
if (version[0] == 9 && version.Length > 1 && version[1] >= 6) return true; if (version[0] == version1 && version.Length > 1 && version[1] >= version2) return true;
return false; return false;
} }
} }