在公司作項目時 常常出現 實體結構和線上的數據結構以及公司開發庫數據結構不匹配的問題 可是又不能直接把開發庫導入到生產庫由於生產庫已經有實際數據了 因此弄了一個小工具sql
此處只作記錄用 demo級 未通過優化數據庫
DapperExtensions.NetCore緩存
Newtonsoft.Json網絡
Oracle.ManagedDataAccess.Core數據結構
新建一個名爲 DBHelper 的 core 2.1 控制檯程序 加入以下代碼:(ps:實體類自備 本例中的實體類經過sqlsugar生成)app
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using CommonHelper; using Dapper; using DapperExtensions; using Newtonsoft.Json; namespace DBHelper { class Program { //實體模型路徑 public static string modelpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DAO"); //實際數據結構獲取源 public const string sourcedbconnStr = "Data Source=192.168.200.151/orcl;User ID=BG;Password=1;"; //要比較的數據庫鏈接串 public const string todbconnStr = "Data Source=192.168.200.151/orcl;User ID=BG2019;Password=1;"; //緩存數據結構對象 若是存在 則再也不去sourcedb中獲取結構 public static string SaveFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sourceList.txt"); //生成的添加字段語句 public static string SqlSaveFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sql.txt"); public static List<string> GetAllTableName() { DirectoryInfo di = new DirectoryInfo(modelpath); var res =new List<string>(); foreach (var item in di.GetFiles("*.cs")) { if (!item.Name.ToLower().StartsWith("base")) res.Add(item.Name.Replace(item.Extension,"")); } return res; } static void Main(string[] args) { //記錄全部的源數據庫 數據結構 List<SourceSaveList> sl = new List<SourceSaveList>(); var tableNames = GetAllTableName(); if (File.Exists(SaveFilePath)) { using (FileStream fs = new FileStream(SaveFilePath, FileMode.Open)) { using (StreamReader sw = new StreamReader(fs)) { var ss = sw.ReadToEnd(); sl = JsonConvert.DeserializeObject<List<SourceSaveList>>(ss); } } } else { var sourceDB = new DapperHelper(sourcedbconnStr); foreach (var item in tableNames) { var source =sourceDB.Conn.Query<TableColumns>( $"select column_name,data_type,data_length from user_tab_cols where table_name='{item}'") .ToList(); sl.Add(new SourceSaveList() { cols = source, tableName = item }); } } var toDB = new DapperHelper(todbconnStr); StringBuilder sb = new StringBuilder(); foreach (var item in tableNames) { var source = sl.First(c => c.tableName == item).cols; var to= toDB.Conn.Query<TableColumns>($"select column_name,data_type,data_length from user_tab_cols where table_name='{item}'") .ToList(); if (source.Count == to.Count) continue; foreach (var source_column in source) { if (to.Any(c => c.COLUMN_NAME == source_column.COLUMN_NAME)) continue; switch (source_column.DATA_TYPE) { case "DATE": sb.Append($"alter table {item} add {source_column.COLUMN_NAME} DATE;"); break; case "TIMESTAMP(6)": sb.Append($"alter table {item} add {source_column.COLUMN_NAME} TIMESTAMP(6);"); break; case "TIMESTAMP": sb.Append($"alter table {item} add {source_column.COLUMN_NAME} TIMESTAMP({source_column.DATA_LENGTH});"); break; default: sb.Append($"alter table {item} add {source_column.COLUMN_NAME} {source_column.DATA_TYPE}({source_column.DATA_LENGTH});"); break; } sb.Append("\r\n"); } } using (FileStream fs = new FileStream(SaveFilePath, FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(JsonConvert.SerializeObject(sl)); } } using (FileStream fs = new FileStream(SqlSaveFilePath, FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(sb.ToString()); } } } } }
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Reflection; using System.Text; using System.Threading.Tasks; using Dapper; using DapperExtensions; using DapperExtensions.Mapper; using DapperExtensions.Sql; using Oracle.ManagedDataAccess.Client; namespace CommonHelper { /// <summary> /// dapper 幫助類 /// </summary> public class DapperHelper { private Database Connection = null; public DapperHelper(string conn) { var orcalConn = new OracleConnection(conn); var orcaleconfig = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new OracleDialect()); var orcaleGenerator = new SqlGeneratorImpl(orcaleconfig); Connection = new Database(orcalConn, orcaleGenerator); } public IDbConnection Conn { get { return Connection.Connection; } } } }
using System; using System.Collections.Generic; using System.Text; namespace DBHelper { public class SourceSaveList { public string tableName { get; set; } public List<TableColumns> cols { get; set; } } }
using System; using System.Collections.Generic; using System.Text; namespace DBHelper { public class TableColumns { public string COLUMN_NAME { get; set; } public string DATA_TYPE { get; set; } public string DATA_LENGTH { get; set; } } }
1.根據本例子的配置 在bin 目錄中 新建DAO目錄並將具體的模型拷入ide
2.將代碼中的sourcedbconnStr 改成開發庫鏈接串工具
2.將代碼中的todbconnStr 改成須要生產庫鏈接串優化
3.運行後會生成 sourceList.txt 用來保存開發庫數據結構 用來支持程序結構拷貝到網絡沒法鏈接的生產數據庫中 ui
若是該文件存在 則不會再去獲取開發庫數據結構
4.sql.txt 該文件即爲缺失字段的添加語句 若是不存在該表 目前會將全部字段均生成添加語句 此狀況目前須要手工處理