zoukankan      html  css  js  c++  java
  • 使用DbUp完成数据库更新

    DbUp可以帮我们创建数据库,通过脚本文件创建表、添加数据;并可通过新创建脚本文件升级现有数据库

    每个脚本文件只会执行一次,如果需要修改表结构或添加数据,添加新sql脚本文件,而不要修改原文件。DbUp通过向目标数据库中添加表SchemaVersions,存储脚本文件执行记录

    脚本文件0001、0002、0003....按顺序执行

    安装:

    dbup-core  (如果使用.NET Framework框架,安装dbup)

    dbup-sqlserver  (sqlserver数据库扩展,也可选择其他数据库扩展包)

    项目截图:

    助手类:

        public class UpdateDBHelper
        {
            /// <summary>
            /// Sql脚本路径格式
            /// </summary>
            private const string SCRIPT_PATH_FORMAT = "./SqlScripts/{0}";
            /// <summary>
            /// 升级数据库
            /// 注意:所有需要执行的Sql脚本必须按照严格版本顺序排序
            /// </summary>
            /// <param name="connectionString">连接字符串</param>
            /// <param name="message">升级信息</param>
            /// <returns>升级是否成功</returns>
            public static bool UpdateDb(List<string> connectionStringList, out string message)
            {
    
                bool updateResult = true;
                message = string.Empty;
                SqlConnectionStringBuilder connectionStringBuilder = null;
                string scriptPath = string.Empty;
                string dbName = string.Empty;
                foreach (var connectionString in connectionStringList)
                {
                    connectionStringBuilder = new SqlConnectionStringBuilder(connectionString);
                    dbName = connectionStringBuilder.InitialCatalog;
                    scriptPath = string.Format(SCRIPT_PATH_FORMAT, dbName);
                    updateResult = UpdateSingleDb(connectionString, scriptPath, out message);
                    if (!updateResult)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine($"{dbName} 升级成功!");
                    }
                }
                return updateResult;
            }
    
            private static bool UpdateSingleDb(string connectionString, string path, out string message)
            {
                message = "";
    
                //检查数据库是否存在,如果不存在就创建然后运行脚本
                EnsureDatabase.For.SqlDatabase(connectionString);
    
                var updateEngineBuilder = DeployChanges.To
                    .SqlDatabase(connectionString)
                    .WithScriptsFromFileSystem(path)
                    .LogToConsole();
                updateEngineBuilder.Configure(configure => { configure.ScriptExecutor.ExecutionTimeoutSeconds = 28800; });
                var updateEngine = updateEngineBuilder.Build();
    
                if (!PreUpdate(updateEngine, out message))
                {
                    return false;
                }
    
                var result = updateEngine.PerformUpgrade();//升级数据库
                if (!result.Successful)
                {
                    message = result.Error.ToString();
                    return false;
                }
    
                return true;
            }
    
    
            /// <summary>
            /// 升级前检查
            /// </summary>
            /// <param name="upgradeEngine"></param>
            /// <param name="errorMsg"></param>
            /// <returns></returns>
            private static bool PreUpdate(UpgradeEngine upgradeEngine, out string errorMsg)
            {
                errorMsg = string.Empty;
                if (!upgradeEngine.TryConnect(out errorMsg))
                {
                    return false;
                }
                //判断是否有数据库版本信息
                var sqlList = upgradeEngine.GetDiscoveredScripts();
                if (sqlList.Count == 0)
                {
                    errorMsg = "升级数据库:找不到数据库版本,无法初始化数据库!";
                    return false;
                }
                //版本控制是否异常
                if (upgradeEngine.GetExecutedButNotDiscoveredScripts().Count > 0)
                {
                    errorMsg = $"版本控制异常,存在 {upgradeEngine.GetExecutedButNotDiscoveredScripts().Count} 个异常版本!";
                    return false;
                }
    
                return true;
            }
    
    
        }

    使用:

            static void Main(string[] args)
            {
                List<string> connectionStringList = new List<string> { "Data Source=xx.xx.xx.xx,30705;uid=sa;pwd=xxxxxxxxx;Initial Catalog=test3;Pooling=true;Max Pool Size=1000;Min Pool Size=5;Connection Timeout=28800" };
                string updateDbMessage = string.Empty;
                Console.WriteLine("更新数据库 开始。。。。");
                bool updateDbResult = UpdateDBHelper.UpdateDb(connectionStringList, out updateDbMessage);
                if (!updateDbResult)
                {
                    Console.WriteLine($"更新数据库 失败!-{updateDbMessage}");
                }
                else
                {
                    Console.WriteLine("更新数据库 成功!");
                }
                Console.ReadKey();
            }

    参考:https://dbup.readthedocs.io/en/latest/

  • 相关阅读:
    [树状数组]H千万别用树套树
    [可持久化权值线段树上二分] Just h-index
    [大数] 组合数
    [模板]离散化
    [树状数组] Galahad
    [可持久化权值线段树] hdu 6703 array
    python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理
    python 调试大法-大笨蛋的笔记
    从终端运行python程序 模块内变量的作用域、添加模块的搜索路径
    Python组织文件 实践:查找大文件、 用Mb、kb显示文件尺寸 、计算程序运行时间
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12512458.html
Copyright © 2011-2022 走看看