diff --git a/src/OnlineWebApp/Properties/launchSettings.json b/src/OnlineWebApp/Properties/launchSettings.json
index 524d342..b7d90bf 100644
--- a/src/OnlineWebApp/Properties/launchSettings.json
+++ b/src/OnlineWebApp/Properties/launchSettings.json
@@ -25,13 +25,6 @@
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
- },
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
}
}
}
diff --git a/src/OnlineWebApp/Views/Home/SyncCheck.cshtml b/src/OnlineWebApp/Views/Home/SyncCheck.cshtml
index 555b4dd..dcd5687 100644
--- a/src/OnlineWebApp/Views/Home/SyncCheck.cshtml
+++ b/src/OnlineWebApp/Views/Home/SyncCheck.cshtml
@@ -4,7 +4,14 @@
@{
ViewData["Title"] = "结构检查";
}
-
+@section css{
+
+}
@@ -14,16 +21,26 @@
-
-
+
+ @* *@
+
+
+ {{ scope.row.name }}
+
+
+
- {{ scope.row.tableName }}
+
-
-
+
- {{ scope.row.tableName }}
+ {{ scope.row.name }}
@@ -32,8 +49,14 @@
部署脚本
-
- {{sql}}
+
+
{{currentRow.syncSql}}
+
+
+
@@ -44,15 +67,17 @@
部署脚本
-
+
SET FOREIGN_KEY_CHECKS=0;
-
-
+
+
+
{{sql}}
-
+
+
SET FOREIGN_KEY_CHECKS=1;
@@ -73,18 +98,25 @@
+
@await RenderSectionAsync("css", required: false)
diff --git a/src/PowerSchemaSync/Models/DiffResult.cs b/src/PowerSchemaSync/Models/DiffResult.cs
index defd936..47d3cd3 100644
--- a/src/PowerSchemaSync/Models/DiffResult.cs
+++ b/src/PowerSchemaSync/Models/DiffResult.cs
@@ -20,17 +20,52 @@ public class DiffInfo
{
public string TableName { get; set; }
- public DiffTable Source { get; set; }
+ public List
Columns { get; set; } = new List();
- public DiffTable Target { get; set; }
+ public List Indexs { get; set; } = new List();
- public List SyncSqls { get; set; } = new List();
+ ///
+ /// 需要操作的类型
+ ///
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public OprateEnum Operate { get; set; }
+
+ public string SyncSql { get; set; }
+ [JsonIgnore]
+ public IEnumerable SyncSqls
+ {
+ get
+ {
+ return Columns.Select(c => c.SyncSql).Concat(Indexs.Select(x => x.SyncSql));
+ }
+ }
+ }
+
+ public class DiffIndex
+ {
///
/// 需要操作的类型
///
[JsonConverter(typeof(JsonStringEnumConverter))]
public OprateEnum Operate { get; set; }
+
+ public string Name { get; set; }
+
+ public string SyncSql { get; set; }
+ }
+
+ public class DiffColumn
+ {
+ ///
+ /// 需要操作的类型
+ ///
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public OprateEnum Operate { get; set; }
+
+ public string Name { get; set; }
+
+ public string SyncSql { get; set; }
}
public enum OprateEnum
diff --git a/src/PowerSchemaSync/PowerSchemaSync.csproj b/src/PowerSchemaSync/PowerSchemaSync.csproj
index d66013e..ebddfdf 100644
--- a/src/PowerSchemaSync/PowerSchemaSync.csproj
+++ b/src/PowerSchemaSync/PowerSchemaSync.csproj
@@ -1,7 +1,7 @@
- 1.1.0
+ 1.2.1
数据库结构同步工具库
net6.0;net461
true
diff --git a/src/PowerSchemaSync/Utilitys/DiffUtility.cs b/src/PowerSchemaSync/Utilitys/DiffUtility.cs
index 770466f..28fe579 100644
--- a/src/PowerSchemaSync/Utilitys/DiffUtility.cs
+++ b/src/PowerSchemaSync/Utilitys/DiffUtility.cs
@@ -57,11 +57,8 @@ public DiffResult Diff()
if (sourceTable == null)
{
- diff.Source = null;
- diff.Target = new DiffTable {/* TODO */ };
-
var dropSql = Target.DropTableSql(targetTable!.Schema, tableName);
- diff.SyncSqls.Add(dropSql);
+ diff.SyncSql = dropSql;
diff.Operate = OprateEnum.Delete;
res.Tables.Add(diff);
continue;
@@ -69,24 +66,18 @@ public DiffResult Diff()
if (targetTable == null)
{
- diff.Source = new DiffTable {/* TODO */ };
- diff.Target = null;
-
- // TODO: 创建表的sql
- diff.SyncSqls.Add(sourceTable.CreateTable);
+ diff.SyncSql = sourceTable.CreateTable;
diff.Operate = OprateEnum.Created;
res.Tables.Add(diff);
continue;
}
// 两库中均存在该表
+ diff.Operate = OprateEnum.None;
+
diffColumns(ref diff, sourceTable, targetTable);
diffIndex(ref diff, sourceTable, targetTable);
- diff.Operate = OprateEnum.Edit;
- if (diff.SyncSqls.Count == 0)
- diff.Operate = OprateEnum.None;
-
res.Tables.Add(diff);
}
@@ -97,6 +88,7 @@ private void diffColumns(ref DiffInfo diff, DataTableModel sourceTable, DataTabl
{
// 1.获取两个库中并集
var unionColumes = sourceTable.Columes.Select(x => x.Name).Union(targetTable.Columes.Select(x => x.Name));
+
foreach (var columeName in unionColumes)
{
var sourceColume = sourceTable.Columes.FirstOrDefault(x => x.Name == columeName);
@@ -104,11 +96,13 @@ private void diffColumns(ref DiffInfo diff, DataTableModel sourceTable, DataTabl
if (sourceColume == null)
{
- diff.Source = null;
- diff.Target = new DiffTable {/* TODO */ };
-
var sql = Target.DropColumnSql(targetTable.Schema, targetTable.TableName, columeName);
- diff.SyncSqls.Add(sql);
+ diff.Columns.Add(new DiffColumn
+ {
+ Name = columeName,
+ Operate = OprateEnum.Delete,
+ SyncSql = sql,
+ });
continue;
}
@@ -135,25 +129,36 @@ private void diffColumns(ref DiffInfo diff, DataTableModel sourceTable, DataTabl
var comment = $"{(string.IsNullOrEmpty(sourceColume.Comment) ? null : $" COMMENT '{sourceColume.Comment}'")}";
if (targetColume == null)
{
- diff.Source = new DiffTable {/* TODO */ };
- diff.Target = null;
-
var sql = Target.AddColumnSql(targetTable.Schema, targetTable.TableName, columeName, sourceColume.COLUMN_TYPE, sourceColume.IsNull, defaultValue, comment, position);
- diff.SyncSqls.Add(sql);
+ diff.Columns.Add(new DiffColumn
+ {
+ Name = columeName,
+ Operate = OprateEnum.Created,
+ SyncSql = sql,
+ });
continue;
}
// 比较两个字段的定义,任何一个不同就需要按源表的字段进行覆盖
- if (!checkType(targetColume, sourceColume)
- || targetColume.DefaultValue != sourceColume.DefaultValue
+ if (targetColume.DefaultValue != sourceColume.DefaultValue
|| targetColume.Comment != sourceColume.Comment
|| targetColume.Extra != sourceColume.Extra
- || targetColume.IsNull != sourceColume.IsNull)
+ || targetColume.IsNull != sourceColume.IsNull || !checkType(targetColume, sourceColume))
{
var sql = Target.ModifyColumnSql(targetTable.Schema, targetTable.TableName, columeName, sourceColume.COLUMN_TYPE, sourceColume.IsNull, defaultValue, comment, position);
- diff.SyncSqls.Add(sql);
+ diff.Columns.Add(new DiffColumn
+ {
+ Name = columeName,
+ Operate = OprateEnum.Edit,
+ SyncSql = sql,
+ });
}
}
+
+ if (diff.Columns.Any(x => x.Operate != OprateEnum.None))
+ {
+ diff.Operate = OprateEnum.Edit;
+ }
}
// 从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT 类型的显示宽度将失效。
@@ -161,6 +166,11 @@ private void diffColumns(ref DiffInfo diff, DataTableModel sourceTable, DataTabl
bool checkType(ColumnMetadata column1, ColumnMetadata column2)
{
+ if (column1.ORDINAL_POSITION != column2.ORDINAL_POSITION)
+ {
+ return false;
+ }
+
if (column1.COLUMN_TYPE == column2.COLUMN_TYPE)
return true;
@@ -188,27 +198,39 @@ private void diffIndex(ref DiffInfo diff, DataTableModel sourceTable, DataTableM
if (sourceIndex == null)
{
- diff.Source = null;
- diff.Target = new DiffTable {/* TODO */ };
-
- diff.SyncSqls.Add($"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` DROP {indexTypeWithName};");
+ var deleteSql = $"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` DROP {indexTypeWithName};";
+ diff.Indexs.Add(new DiffIndex
+ {
+ Name = indexName,
+ Operate = OprateEnum.Delete,
+ SyncSql = deleteSql
+ });
continue;
}
var comment = $"{(string.IsNullOrEmpty(sourceIndex.COMMENT) ? null : $" COMMENT '{sourceIndex.COMMENT}'")}";
if (targetIndex == null)
{
- diff.Source = new DiffTable {/* TODO */ };
- diff.Target = null;
-
if (sourceIndex.IndexType == "FULLTEXT")
{
// 查看源表全文索引使用的解析器
var parser = getFTParser(sourceTable.CreateTable, indexName);
- diff.SyncSqls.Add($"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` ADD FULLTEXT {indexTypeWithName}({sourceIndex.ColumnsJoined}){parser}{comment};");
+ diff.Indexs.Add(new DiffIndex
+ {
+ Name = indexName,
+ Operate = OprateEnum.Created,
+ SyncSql = $"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` ADD FULLTEXT {indexTypeWithName}({sourceIndex.ColumnsJoined}){parser}{comment};"
+ });
}
else
- diff.SyncSqls.Add($"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` ADD {indexTypeWithName}({sourceIndex.ColumnsJoined}) USING {sourceIndex.IndexType}{comment};");
+ {
+ diff.Indexs.Add(new DiffIndex
+ {
+ Name = indexName,
+ Operate = OprateEnum.Created,
+ SyncSql = $"ALTER TABLE `{targetTable.Schema}`.`{targetTable.TableName}` ADD {indexTypeWithName}({sourceIndex.ColumnsJoined}) USING {sourceIndex.IndexType}{comment};"
+ });
+ }
continue;
}
@@ -230,9 +252,19 @@ private void diffIndex(ref DiffInfo diff, DataTableModel sourceTable, DataTableM
else
dropAndRebuild.Append($"ADD {indexTypeWithName}({sourceIndex.ColumnsJoined}) USING {sourceIndex.IndexType}{comment};");
- diff.SyncSqls.Add(dropAndRebuild.ToString());
+ diff.Indexs.Add(new DiffIndex
+ {
+ SyncSql = dropAndRebuild.ToString(),
+ Operate = OprateEnum.Edit,
+ Name = indexName,
+ });
}
}
+
+ if (diff.Indexs.Any(x => x.Operate != OprateEnum.None))
+ {
+ diff.Operate = OprateEnum.Edit;
+ }
}
private string getFTParser(string createTable, string indexName)