使用 dbdeploy.net 管理数据库变更
使用 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 管理数据库变更的更多相关文章
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
- [转]使用VS2010的Database 项目模板统一管理数据库对象
本文转自:http://www.cnblogs.com/shanyou/archive/2010/05/08/1730810.html Visual Studio 2010 有一个数据库项目模板:Vi ...
- Flyway版本化管理数据库脚本
假如我们有一个叫shiny的项目,它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的; 简单结构图如下: 但是很多时候,现实开发团队是这样的: 我们的项目shiny项目的运行 ...
- Spring Boot 2.x基础教程:使用Flyway管理数据库版本
之前已经介绍了很多在Spring Boot中使用MySQL的案例,包含了Spring Boot最原始的JdbcTemplate.Spring Data JPA以及我们国内最常用的MyBatis.同时, ...
- 使用Flyway来管理数据库版本
使用Flyway来管理数据库版本 Flyway是什么 Flyway是一款数据库迁移(migration)工具. 它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减 ...
- 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础
优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...
- CentOS下开启mysql远程连接,远程管理数据库
当服务器没有运行php.没装phpmyadmin的时候,远程管理mysql就显得有必要了.因为在CentOS下设置的,所以标题加上了CentOS,以下的命令在debian等系统下应该也OK. mysq ...
- 数据库(SQL Server)管理数据库表~新奇之处
说到“数据库”,我总有一种莫名的感觉,在刚刚接触到的数据库中就让我似懂非懂渡过着,于是思考着.于是在冷静的时空中让我回想到了很多的知识,不知你们是怎样过来的,真心希望我的这篇数据库总结能够让我们都有一 ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
随机推荐
- 使用Nginx的配置对cc攻击进行简单防御
ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击. cc攻击:类似于ddos攻击,不过它的特点是主要是发起大量页面请求,所以流量不大,但是却 ...
- 【最短路径】 常用算法图解+1376:信使(msner)六解
进入图之后,最短路径可谓就是一大重点,最短路径的求法有很多种,每种算法各有各的好处,你会几种呢?下面来逐个讲解. 1 floyed算法 1)明确思想及功效:在图中求最短路还是要分开说的,分别是单源最短 ...
- JZYZOJ1390【noi2001】炮兵阵地 状压DP
http://172.20.6.3/Problem_Show.asp?id=1390 需要储存该行和上一行两个状态.通过观察规则可以发现条件允许的状态很少(相邻两个至少空两格),据此可以减少状态数量, ...
- 【置换群】【枚举约数】hdu6038 Function
把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就 ...
- 20162327实验一Java开发环境的熟悉实验报告
20162327 <程序设计与数据结构>第一次实验报告 基础知识 1.JDB的使用 使用JDB调试程序需要以下五个步骤: 1.设置断点 stop in 2.run 3.print 4.ne ...
- python基础之类与对象,继承与派生
类与对象 对象的本质也就是一个名称空间而已,用于存放自己独有的属性,而类中存放的是对象共有的属性. __init__会在调用类时自动触发 调用类时发生两件事: 1.创建一个空对象stu1 2.自动触发 ...
- mvn在线仓库搜索
使用Maven进行开发的时候,比较常见的一个问题就是如何寻找我要的依赖,比如说,我想要使用activeMQ,可是我不知道groupId,artifactId,和合适的version.怎么办呢?本文介绍 ...
- WebAPI 操作返回
定义了一个返回枚举: public enum ResultExceptionEnum { 积分不足 = , 支付失败 = , 用户不存在 = , 验证码发送失败 = , 验证码不正确 = , 账号已存 ...
- Chrome下flash无法显示多个的问题。
$(document).ready(function(){ if(window.navigator.appVersion.match(/Chrome/)) { jQuery('object').eac ...
- Android ANR优化 1
1, 你碰到ANR了吗 在App使用过程中, 你可能遇到过这样的情况: ANR 恭喜你, 这就是传说中的ANR. 1.1 何为ANR ANR全名Application Not Responding, ...