From cd27c7e03a4b49d59aaa2e7000e208ac6be8d6f7 Mon Sep 17 00:00:00 2001 From: xief <1789784602@qq.com> Date: Mon, 24 Jan 2022 15:12:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=84=9A=E6=9C=AC=E6=89=A7?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Archiver/Commands/CopyTableCommand.cs | 164 ++++++++++++---------- 1 file changed, 91 insertions(+), 73 deletions(-) diff --git a/src/Archiver/Commands/CopyTableCommand.cs b/src/Archiver/Commands/CopyTableCommand.cs index fb5efb8..558b8dc 100644 --- a/src/Archiver/Commands/CopyTableCommand.cs +++ b/src/Archiver/Commands/CopyTableCommand.cs @@ -16,7 +16,7 @@ using Chenfeng.MES.Archiver.Data; namespace Chenfeng.MES.Archiver.Commands { [Command("copy")] - public class CopyTableCommand : ICommand,IArchiveReader + public class CopyTableCommand : ICommand, IArchiveReader { [CommandOption("connection", Description = "数据库连接")] public string Connection { get; set; } = ""; @@ -45,6 +45,9 @@ namespace Chenfeng.MES.Archiver.Commands [CommandOption("script", Description = "是否生成执行脚本")] public bool Script { get; set; } + [CommandOption("verbose", 'v', Description = "显示sql")] + public bool Verbose { get; set; } + public ValueTask ExecuteAsync(IConsole console) { Print = (text) => console.Output.WriteLine($"{DateTime.Now.ToLongTimeString()} {text}"); @@ -52,22 +55,7 @@ namespace Chenfeng.MES.Archiver.Commands var starMonth = DateTime.Now.AddMonths(-12).ToString("yyyyMM"); SqlMapper.Settings.CommandTimeout = 60 * Timeout; - var executeType = "copy"; - if (RemoveBackup) - { - executeType = "rm_bak"; - console.Output.WriteLine("删除备份表"); - } - else if (Restore) - { - executeType = "restore"; - console.Output.WriteLine("还原备份表"); - } - else - { - console.Output.WriteLine($"拷贝"+( Legacy ? "旧" :"新")+"版表数据"+(Replace?"并替换":"")); - } - + console.Output.WriteLine((Legacy ? "旧" : "新") + "版数据库"); try { if (this.Connection.Length > 0) @@ -77,31 +65,41 @@ namespace Chenfeng.MES.Archiver.Commands connBuilder.CharacterSet = "utf8"; Db = new MySqlConnection(connBuilder.ConnectionString); } - + Db?.Open(); if (Legacy) { - TableQueryHelper.MesLegacyTables(this,starMonth); + TableQueryHelper.MesLegacyTables(this, starMonth); } else { - TableQueryHelper.MesTables(this,starMonth); + TableQueryHelper.MesTables(this, starMonth); + } + + if (Db!=null && sqlScripts.Length>0) + { + var sql = "set foreign_key_checks = 0;" + sqlScripts.ToString() + "set foreign_key_checks = 1;"; + if (Verbose) + { + Print(sql); + } + Db.Execute(sql); } if (Script) { - if (Directory.Exists("./scripts")==false) + if (Directory.Exists("./scripts") == false) { Directory.CreateDirectory("./scripts"); } - using (var file = File.OpenWrite($"./scripts/mes{(Legacy?"-legacy":"")}-table-{executeType}.sql")) + using (var file = File.OpenWrite($"./scripts/mes{(Legacy ? "-legacy" : "")}-table.sql")) { using (var writer = new StreamWriter(file)) { writer.Write(sqlScripts); } } - + } Print("操作成功"); @@ -121,36 +119,79 @@ namespace Chenfeng.MES.Archiver.Commands public void ExecuteData(string table, string where, object param) { - ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT * FROM `{table}` WHERE {where}", param); - } - - public void ExecuteChildData(string table, string parentTable, string condition) - { - ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT child.* FROM `{TableDic[parentTable]}` parent join `{table}` child on {condition} "); - } - - private StringBuilder sqlScripts = new StringBuilder(); - private void ExecuteSql(string sql, object param = null) - { - Db?.Execute(sql,param); - if (Script) + if (ExecuteBefore(table)) { - var fullSql = sql + ";"; - if(param != null) - { - foreach (var property in param.GetType().GetProperties()) - { - var val = property.GetValue(param)?.ToString(); - fullSql =fullSql.Replace("@" + property.Name, val); - } - } - sqlScripts.AppendLine(fullSql); + ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT * FROM `{table}` WHERE {where}", param); } } + public void ExecuteChildData(string table, string parentTable, string condition) + { + if (ExecuteBefore(table)) + { + ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT child.* FROM `{TableDic[parentTable]}` parent join `{table}` child on {condition} "); + } + } + + private bool ExecuteBefore(string table) + { + if (RemoveBackup) + { + ExecuteSql($"DROP TABLE IF EXISTS `{table}_bak`", Execute: false); + } + else if (Restore) + { + + ExecuteSql($"DROP TABLE IF EXISTS `{table}`", Execute: false); + ExecuteSql($"RENAME TABLE `{table}_bak` TO `{table}`", Execute: false); + } + else if (Replace) + { + + ExecuteSql($"RENAME TABLE `{table}` TO `{table}_bak`", Execute: false); + ExecuteSql($"RENAME TABLE `{TableDic[table]}` TO `{table}`", Execute: false); + + } + else + { + ExecuteSql($"DROP TABLE IF EXISTS `{TableDic[table]}`"); + ExecuteSql($"CREATE TABLE `{TableDic[table]}` LIKE `{table}`"); // IF NOT EXISTS + Print(TableDic[table] + " 创建完成"); + return true; + } + return false; + } + + + + private StringBuilder sqlScripts = new StringBuilder(); + private void ExecuteSql(string sql, object? param = null, bool Execute = true) + { + if (Execute) + { + Db?.Execute(sql, param); + } + + if (Script || Execute == false) + { + var fullSql = sql + ";"; + if (param != null) + { + foreach (var property in param.GetType().GetProperties()) + { + var val = property.GetValue(param)?.ToString(); + fullSql = fullSql.Replace("@" + property.Name, val); + } + } + sqlScripts.AppendLine(fullSql); + } + + } + + + public Dictionary TableDic { get; set; } = new Dictionary(); - public Dictionary TableDic { get; set; } = new Dictionary(); public void Step(Action action, params string[] tables) { @@ -162,33 +203,10 @@ namespace Chenfeng.MES.Archiver.Commands foreach (var item in list) { - if (RemoveBackup) - { - ExecuteSql($"DROP TABLE IF EXISTS `{item.Table}_bak`"); - } - else if (Restore) - { - ExecuteSql($"DROP TABLE IF EXISTS `{item.Table}`"); - ExecuteSql($"RENAME TABLE `{item.Table}_bak` TO `{item.Table}`"); - } - else - { - TableDic[item.Table] = item.NewTable; - - ExecuteSql($"DROP TABLE IF EXISTS `{item.NewTable}`"); - ExecuteSql($"CREATE TABLE `{item.NewTable}` LIKE `{item.Table}`"); // IF NOT EXISTS - - Print(item.NewTable + " 创建完成"); - action(item.Table); - Print(item.NewTable + " 拷贝完成"); - - if (Replace) - { - ExecuteSql($"RENAME TABLE `{item.Table}` TO `{item.Table}_bak`"); - ExecuteSql($"RENAME TABLE `{item.NewTable}` TO `{item.Table}`"); - } - } + TableDic[item.Table] = item.NewTable; + action(item.Table); } + } } }