使用 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. 最大子数组(LintCode)

    最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数 ...

  2. Codeforces Round #300 Quasi Binary(DP)

    Quasi Binary time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. cpu亲和性绑定

    将进程与cpu绑定,最直观的好处就是减少cpu之间的cache同步和切换,提高了cpu cache的命中率,提高代码的效率.从cpu架构上,NUMA拥有独立的本地内存,节点之间可以通过互换模块做连接和 ...

  4. HashMap 不能并发

    问题的症状 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现 ...

  5. andorid关于selector更换图片失效

    写selector的xml文件时,需注意item的顺序,不带状态的item放在最后,否则selector无效 为按钮写了一个selector,一个正常状态,一个点击的状态,用了两张不同的图片.以求达到 ...

  6. linux centos下安装docker

    1.在vm中装好好centos后,更新内核 运行docker需要内核版本为3.8或者更高的版本,内核必须支持一种合适的存储驱动(Drivice Mapper.AUFS.vfs.btrfs.ZFS),默 ...

  7. 5月学习总结(Ant-Design,mustache,require.js,grunt)

    一.Ant-Design学习 因为Ant-Design是基于React实现的,之前自己也学过一段时间的React,对React还是相对比较熟悉的,在学习Ant-Design也还不算吃力. 最开始是从源 ...

  8. Codeforces Round #343 (Div. 2) B. Far Relative’s Problem 暴力

    B. Far Relative's Problem 题目连接: http://www.codeforces.com/contest/629/problem/B Description Famil Do ...

  9. ucenter创始人密码忘记了,修改方法

    简单的:1.在UCenter/data/下找到config.inc.php,打开找到下面2行代码: define('UC_FOUNDERPW', '3858cdf66b0794bfd435af8c0c ...

  10. andriod inputType

    <EditText Android:layout_width="fill_parent" android:layout_height="wrap_content&q ...