首页 > 数据库 >数据库脚本自动执行工具

数据库脚本自动执行工具

时间:2024-10-22 21:09:45浏览次数:1  
标签:脚本 Evolve DbUp 数据库 自动 sql new 执行

第一款:Evolve

官网:https://evolve-db.netlify.app/requirements/
仓库:https://github.com/lecaillon/Evolve
提供了三种使用方式:

  1. 类库:可以引入到现有的项目中
  2. nuget包:可以直接安装并在命令行中使用
  3. cli:可以不依赖.net sdk直接运行

细节

  • 命名要求:
    • 前缀:仅执行一次的脚本以V开头,可重复执行脚本以R开头;
    • 版本:计数器,且使用“_”分隔,最后使用分隔描述。如:
      • V1_3_1_1__Create_table.sql
    • 描述:“__(双下横杠)”跟上脚本的描述
    • 校验和:系统根据脚本内容计算,校验和不同但名字相同,再次运行会重新执行
  • 执行顺序:目录内以版本号的顺序执行。多个目录按照目录的名称顺序执行。
  • 事务:默认每个脚本都是一个事务,可以通过参数改为一次迁移一个事务。

占位符功能

可以通过使用${}括起一个字符串,然后在程序运行前指定其替换的规则。这些占位符将在脚本实际运行时被替换,以达到动态迁移的效果。

evolve.Placeholders = new Dictionary<string, string>
{
    ["${database}"] = "my_db",
    ["${schema1}"] = "my_schema"
}

日志记录

首次执行时,会在连接的数据库中创建changelog表,所有被执行过的脚本都会记录在内。其中:

  • type:
    • 0:版本迁移
    • 1:新架构
    • 2:空架构
    • 3:启动版本,在程序运行前可以设置数据库的起点版本。
    • 4:可重复的脚本类型

DbUp

官网:https://dbup.readthedocs.io/en/latest/
仓库:https://github.com/DbUp/DbUp
提供了nuget包、powershell两种方式,不过shell版本没有怎么了解,下面着重说下nuget包版本的。

细节

  1. 命名方式:没有限制,代码和脚本保持一致,做好约定即可。
  2. 执行顺序:完全按照名称排序执行
  3. 事务:支持无事务、单脚本事务、迁移事务

代码脚本

DbUp除了支持传统的sql脚本执行,还支持我们使用C#来书写脚本。在撰写一些较为复杂的脚本或者对于sql语句不熟悉的开发者来说可以有效提高出脚本的效率。

public class Script0005ComplexUpdate : IScript
{
    public string ProvideScript(Func<IDbCommand> commandFactory)
    {
        var cmd = commandFactory();
        cmd.CommandText = "Select * from SomeTable";
        var scriptBuilder = new StringBuilder();

        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                scriptBuilder.AppendLine(string.Format("insert into AnotherTable values ({0})", reader.GetString(0)));
            }
        }

        return scriptBuilder.ToString();
    }
}

代码解释:查询了SomeTable,并根据结果的第一列值向AnotherTable插入数据。

脚本提供方式

  1. 嵌入式
  2. 文件系统
  3. 静态
  4. 嵌入式+代码

嵌入式

在项目中新建文件夹,并在csproj中设置其及其所有子文件为Embedded,那么在程序打包后将一同编译到exe中,无法做后续修改。

builder.WithScriptsEmbeddedInAssemblies(new[]
{
    Assembly.GetExecutingAssembly(),
    typeof(Something).Assembly
},
(string s) => s.StartsWith("Script"))

文件系统

给出系统路径,每次运行时根据路径读取脚本。程序会读取指定路径下所有的sql文件并执行。

builder.WithScriptsFromFileSystem(path)

对于这种方式,还可以添加自定义的选项:

var options = new FileSystemScriptOptions
{
  // true = scan into subdirectories, false = top directory only
  IncludeSubDirectories = true,

  // Patterns to search the file system for. Set to "*.sql" by default.
  Extensions = new [] { "*.sql" },

  // Type of text encoding to use when reading the files. Defaults to "Encoding.UTF8".
  Encoding = Encoding.UTF8,

  // Pass each file path located to this function and filter based on the result
  Filter = path => path.Contains("value")
}

builder.WithScriptsFromFileSystem(path, options);

静态

直接在代码中书写脚本并命名,适用于那些固定每次迁移都要执行的脚本。

// Single script
builder.WithScript("name.sql", "content");
// Many scripts
builder.WithScripts(new[]
{
  new SqlScript("script1.sql", "content"),
  new SqlScript("script2.sql", "content2")
});
// Custom script provider
builder.WithScripts(new MyCustomScriptProvider());

嵌入式+代码

就是先前的代码脚本也可以和sql脚本放一块执行。

脚本类型

Dbup没有通过事先约定的命名来区分脚本类型,而是提供了两个枚举,是我们可以自由定义哪些脚本应该被重复执行。

  • RunOnce - 默认的,仅执行一次
  • RunAlways - 总是执行
var upgradeEngineBuilder = DeployChanges.To
    .SqlDatabase(connectionString, null) //null or "" for default schema for user
    .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly(), script => script.StartsWith("SampleApplication.Scripts."), new SqlScriptOptions { ScriptType = ScriptType.RunOnce })
    .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly(), script => script.StartsWith("SampleApplication.RunAlways."), new SqlScriptOptions { ScriptType = ScriptType.RunAlways })
    .LogToConsole();

预处理器

类似于中间件,在脚本执行之前我们可以对其再做一些更改。比如变量替换什么的,不过变量替换已经有实现了可以直接使用。
实现IScriptPreprocessor接口:

DeployChanges
  .To
  .SqlDatabase(..)
  .WithPreprocessor(new MyPreprocessor());

日志

可以输出日志到控制台或是对接nlog、Serilog到文件,也可以两种同时使用。

执行记录

初次运行会创建SchemaVersions表,记录已执行的脚本。
image

变量替换

HTML报告

分组运行顺序

差异点比较

  • Evolve有校验和,在内容发生改变时会重新执行;DbUp则没有
  • Evolve的命名方式固定,灵活性不如DbUp
  • Evolve只能执行sql,DbUp还支持代码脚本
    在灵活性和丰富度上,DbUp要略胜一筹。且DbUp虽然沉寂了很久但最近又重新开始维护了,而Evolve很久都没有更新,所以个人还是比较推荐DbUp。后面待项目组开始使用后再持续更新本文。

标签:脚本,Evolve,DbUp,数据库,自动,sql,new,执行
From: https://www.cnblogs.com/throughFog/p/18493748

相关文章

  • 10 问 OB Cloud 云数据库
    随着云计算与人工智能的持续进步,云数据库日益成为企业数据管理的首选,凭借其高可用性、弹性扩展及运维简单等特点,更快地推动了企业的数字化转型步伐。2022年,OceanBase推出了OBCloud云数据库,标志着云数据库战略的正式启动。在随后的两年里,OBCloud迅速赢得了超过700家客户的......
  • Python——脚本实现datax全量同步mysql到hive
    文章目录前言一、展示脚本二、使用准备1、安装python环境2、安装EPEL3、安装脚本执行需要的第三方模块三、脚本使用方法1、配置脚本2、创建.py文件3、执行脚本4、测试生成json文件是否可用前言在我们构建离线数仓时或者迁移数据时,通常选用sqoop和datax等工具进行......
  • jsp高校二级学院通用门户网站p9s8s程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,日志信息,分享信息,标签开题报告内容一、研究背景与目的随着互联网的普及和信息技术的发展,高校二级学院门户网站已成为学院对外展示形象、发布信息、提供......
  • jsp高校创新创业服务平台6eb2q--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,专家,创业新闻,创业政策,项目申请,项目指派,初期答辩,中期答辩,结题答辩,创业项目开题报告内容一、研究背景与意义随着国家创新驱动发展战略的深入实施,高......
  • jsp高校毕业生就业信息管理系统k7241(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,企业,岗位信息,招聘信息,应聘信息,就业情况,就业协议,问题反馈,反馈回复开题报告内容一、项目背景面对日益严峻的高校毕业生就业形势,传统的人工就业......
  • PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展
    检查并开启 sqlite3 扩展打开PHPStudyPro软件。导航至设置->配置文件->php.ini。选择你当前使用的PHP版本(例如 php7.3.4nts)并点击打开 php.ini 文件。在 php.ini 文件中搜索 extension=sqlite3。如果该行被注释掉(前面有分号 ;),则去掉分号以启用扩展。保......
  • SSM高校教学设备管理系统j4dcd+程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,设备信息,设备申请,设备归还,设备采购,设备维修,设备报废开题报告内容一、研究背景与意义随着高校教学设备的不断增加,传统的手工管理方式已无法......
  • SSM高校教学信息反馈流转系统+程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:采集员,教学院部,教学管理部,发布问题,教学管理部审核,管理员审核,在线沟通,在线回复,评价信息开题报告内容一、课题名称高校教学信息反馈流转系统的......
  • shell脚本技巧—创建和清空文件
    写这篇文章的起因是因为在分析一个脚本时,看到这么一句脚本,如下所示................................>$RMAN_BACKUP/script/rman_backup.sql................................最开始我以为它就是将文件rman_backup.sql清空,这个类似于cat/dev/null>$RMAN_BACKUP/script/rman_......
  • 2024年软件设计师中级(软考中级)详细笔记【9】数据库技术基础(分值6分)
    目录前言第9章数据库技术基础(6分)9.1基本概念9.1.1数据库与数据库系统9.1.5数据库的三级模式结构9.2数据模型9.2.1数据模型的基本概念9.2.2数据模型的三要素9.2.3E-R模型9.2.4数据模型9.3关系代数9.3.1关系数据库的基本概念9.3.1.1关系模型9.3.25种基本的......