使用 dbdeploy.net 管理数据库变更

没有包含数据库的持续集成都是假的。这可不是我说的。
一直以来都没能找到一个理想的数据库变更管理工具。直到转了 java 再回来,才发现 dbdeploy 是有.net 版的。赶紧尝试一下。

一、工具
先是从 sourceForge 上下载了成品,试运行发现找不到依赖的 dll,而且版本也比较老(2013年构建的)。想到要是有源码编译一份就好了。从 github 上搜索 dbdeploy.net,第一个就是,除了源码外还有详细的使用说明,实在太重要了。

把源码拿下来编译(用的 vs2013)也是编译不过,提示找不到依赖包。用 nuget 管理了一下包,终于编译通过。从 Dbdeploy.Console\bin\Debug 下拿到完整的工具。接下来开始使用。

二、配置
根据 github 上的使用说明,运行时可以直接使用命令行,也可以使用配置文件。感觉上还是配置文件更方便管理。在 debug 下创建 run.bat 和 run.config.xml. 两个文件的内容如下:

run.bat
---------------------------------------------------------
dbdeploy.exe --config=run.config.xml
---------------------------------------------------------

run.config.xml
---------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<!-- Multiple deployments can be executed. -->
<config>
  <dbdeployments>

<!-- Run with all options. -->
    <dbdeploy
        dbms="mysql"
        connectionString="Server=127.0.0.1; port=3306; Initial Catalog=testdb;User Id=root;Password=root"
        scriptDirectory="..\src"
        outputFile="..\target\changes.sql"
        changeLogTableName="changelog"
        autoCreateChangeLogTable="true"
        forceUpdate="false"
        useSqlCmd="true"
        encoding="UTF-8"
        templateDirectory="Resources"
        delimiter=";"
        delimiterType="row"
        lineEnding="LF"
        />
  </dbdeployments>
</config>
---------------------------------------------------------

说明:
1. 数据库是 mysql
2. 所有的数据库变更脚本在 ../src 目录,运行后输出的文件要放置在:../target 目录
3. 由于 dbdeploy 使用一个变更表保存所有的变更历史,因此需要指定这个表名,在这里使用的是 changelog
4. 其它参数比较简单,一看就明白。

创建好目录就可以运行了,我的目录结构如下:
/
    src/
        *.sql     --放置变更的脚本
    target/      -- 输出
    tools/
        Resources/
        dbdeploy.exe
        *.dll
        run.bat
        run.config.xml

三、运行
使用时,运行 run.bat 即可。一方面,它会将变更应用到本地数据库,另一方面,在 target/ 目录下生成 changes.sql, 可当作上线脚本。
第一运行时,报了一个错:"找不到 MysqlData.dll, version=1.0....", 这些数据库驱动是运行时动态加载的。需要将对应的驱动模块放到 tools 目录。从 mysql 官网下载 mysql-connector-net. 把 MysqlData.dll 拿过来,然后编辑 dbproviders.xml, 找到 mysql, 修改对应的内容为:
assemblyName="MySql.Data"

这么做是为了不受 MySqlData.dll 的版本影响,无论什么版本都能加载。

再次运行,没再报错。

四、实践
如何利用工具进行数据库变更管理?
1. 所有结构性变更,配置性变更都记录到脚本中。其中结构性变更位于 DDL.sql 中,配置性变更位于 DML.sql 中。
2. 为了能使用变更顺序地执行,特将变更文件名格式定为:yyyyMMddHHmmss_DML.sql. (DLL类似)
3. 创建辅助脚本,生成变更的文件。在本地创建 createDDLFile.bat 和 createDMLFile.bat. 内容如下:
createDDLFile.bat
---------------------------------------------------------
@echo off

set t=%Time%
if "%t:~0,1%" ==" " (
    set t=0%t:~1%
)
set NO=%Date:~0,4%%Date:~5,2%%Date:~8,2%%t:~0,2%%t:~3,2%%t:~6,2%

set filename=%no%_DDL.sql
set filepath="src\%filename%"

echo "" > %filepath%
echo New File: %filename%
---------------------------------------------------------

使用 dbdeploy.net 管理数据库变更的更多相关文章

  1. asp.net core系列 30 EF管理数据库架构--必备知识 迁移

    一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...

  2. [转]使用VS2010的Database 项目模板统一管理数据库对象

    本文转自:http://www.cnblogs.com/shanyou/archive/2010/05/08/1730810.html Visual Studio 2010 有一个数据库项目模板:Vi ...

  3. Flyway版本化管理数据库脚本

    假如我们有一个叫shiny的项目,它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的; 简单结构图如下: 但是很多时候,现实开发团队是这样的: 我们的项目shiny项目的运行 ...

  4. Spring Boot 2.x基础教程:使用Flyway管理数据库版本

    之前已经介绍了很多在Spring Boot中使用MySQL的案例,包含了Spring Boot最原始的JdbcTemplate.Spring Data JPA以及我们国内最常用的MyBatis.同时, ...

  5. 使用Flyway来管理数据库版本

    使用Flyway来管理数据库版本 Flyway是什么 Flyway是一款数据库迁移(migration)工具. 它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减 ...

  6. 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础

    优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...

  7. CentOS下开启mysql远程连接,远程管理数据库

    当服务器没有运行php.没装phpmyadmin的时候,远程管理mysql就显得有必要了.因为在CentOS下设置的,所以标题加上了CentOS,以下的命令在debian等系统下应该也OK. mysq ...

  8. 数据库(SQL Server)管理数据库表~新奇之处

    说到“数据库”,我总有一种莫名的感觉,在刚刚接触到的数据库中就让我似懂非懂渡过着,于是思考着.于是在冷静的时空中让我回想到了很多的知识,不知你们是怎样过来的,真心希望我的这篇数据库总结能够让我们都有一 ...

  9. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

随机推荐

  1. 使用Nginx的配置对cc攻击进行简单防御

    ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击. cc攻击:类似于ddos攻击,不过它的特点是主要是发起大量页面请求,所以流量不大,但是却 ...

  2. 【最短路径】 常用算法图解+1376:信使(msner)六解

    进入图之后,最短路径可谓就是一大重点,最短路径的求法有很多种,每种算法各有各的好处,你会几种呢?下面来逐个讲解. 1 floyed算法 1)明确思想及功效:在图中求最短路还是要分开说的,分别是单源最短 ...

  3. JZYZOJ1390【noi2001】炮兵阵地 状压DP

    http://172.20.6.3/Problem_Show.asp?id=1390 需要储存该行和上一行两个状态.通过观察规则可以发现条件允许的状态很少(相邻两个至少空两格),据此可以减少状态数量, ...

  4. 【置换群】【枚举约数】hdu6038 Function

    把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就 ...

  5. 20162327实验一Java开发环境的熟悉实验报告

    20162327 <程序设计与数据结构>第一次实验报告 基础知识 1.JDB的使用 使用JDB调试程序需要以下五个步骤: 1.设置断点 stop in 2.run 3.print 4.ne ...

  6. python基础之类与对象,继承与派生

    类与对象 对象的本质也就是一个名称空间而已,用于存放自己独有的属性,而类中存放的是对象共有的属性. __init__会在调用类时自动触发 调用类时发生两件事: 1.创建一个空对象stu1 2.自动触发 ...

  7. mvn在线仓库搜索

    使用Maven进行开发的时候,比较常见的一个问题就是如何寻找我要的依赖,比如说,我想要使用activeMQ,可是我不知道groupId,artifactId,和合适的version.怎么办呢?本文介绍 ...

  8. WebAPI 操作返回

    定义了一个返回枚举: public enum ResultExceptionEnum { 积分不足 = , 支付失败 = , 用户不存在 = , 验证码发送失败 = , 验证码不正确 = , 账号已存 ...

  9. Chrome下flash无法显示多个的问题。

    $(document).ready(function(){ if(window.navigator.appVersion.match(/Chrome/)) { jQuery('object').eac ...

  10. Android ANR优化 1

    1, 你碰到ANR了吗 在App使用过程中, 你可能遇到过这样的情况: ANR 恭喜你, 这就是传说中的ANR. 1.1 何为ANR ANR全名Application Not Responding, ...