jawbfl / dbdiff
Requires
- aura/cli: 2.*@dev
- diff/diff: 2.0.*@dev
- illuminate/container: 4.*
- illuminate/database: 4.*
- illuminate/view: 4.*
- symfony/yaml: 2.8.*@dev
Requires (Dev)
- phpunit/phpunit: 4.8.*@dev
This package is auto-updated.
Last update: 2024-08-29 04:09:07 UTC
README
DBDiff 是一个自动化的数据库架构和数据比较工具。它可以比较两个本地或远程数据库,并自动生成差异迁移文件。
当与兼容的数据库迁移工具一起使用时,它可以帮助您在团队或企业内部实现数据库版本控制。
支持 DBDiff
DBDiff 是一个 MIT 许可的开源项目,其持续开发完全由支持者资助。为了得到回报的提及,请考虑以下方式:
- 在 Patreon 上成为支持者或赞助者.
- 通过 PayPal 的一次性捐赠
- 如果您是个人、公司或组织,对 DBDiff 感兴趣并希望获得商业支持包,请联系我们:https://akalsoftware.com/contact-us/
特性
- 在 Windows、Linux & Mac 命令行/Terminal 上运行,因为它是用 PHP 开发的
- 连接到源数据库和目标数据库进行比较差异,本地和远程均可
- 差异可以包括架构和/或数据的更改,以有效的 SQL 形式使目标与源保持一致
- 可以通过配置文件中的 YAML 集合忽略一些表和/或字段进行比较(请参阅文件示例)
- 差异非常快,该工具已测试过具有数百万行多个表的数据库
- 由于此差异工具用于迁移,因此它提供同一文件中的上和下 SQL
- 通过指定输出模板文件/格式与现有的迁移工具(如 Flyway 和 Simple DB Migrate)一起使用,例如,Simple DB Migrate 可以与 simple-db-migrate.tmpl 一起使用,它包括:
SQL_UP = u""" {{ $up }} """ SQL_DOWN = u""" {{ $down }} """ - 具有 Unicode 支持,可以处理 UTF8 数据,包括外文字符/符号
- 目前仅支持 MySQL,但根据请求将在未来扩展到其他数据库(请创建一个问题并投票!)
先决条件
- 您需要能够访问命令行,对于 Linux/Mac 是终端,对于 Windows 是命令提示符(
cmd) - 您需要安装 git:https://git-scm.cn/downloads
- 您需要安装 PHP(版本 5.4.x):https://php.ac.cn/manual/en/install.php
- 您需要安装 Composer,它是 PHP 的依赖管理器:https://composer.php.ac.cn
注意:请记住 composer.phar 的安装位置,我们稍后设置时需要它
安装
在命令行中,使用 git 克隆 ssh 版本
git clone git@github.com:DBDiff/DBDiff.git
或者 使用 git 克隆 https 版本
git clone https://github.com/DBDiff/DBDiff.git
或者 下载 .zip 压缩文件并将其解压到您选择的文件夹中,例如 dbdiff
https://github.com/DBDiff/DBDiff/archive/master.zip
或者 使用 composer 将 DBDiff 包含为项目依赖项
php composer.phar require "dbdiff/dbdiff:@dev"
或者 使用 composer 全局安装 DBDiff
composer global require "dbdiff/dbdiff:@dev"
创建 PHAR 构建
请确保在您的 php.ini 文件中将 phar.readonly 设置设置为 false,例如
[Phar] ; https://php.ac.cn/phar.readonly phar.readonly = false
然后,在 dbdiff 仓库的根目录中运行以下命令以生成 Phar 构建
$ ./build
应创建一个包含以下文件的 dist 文件夹
- dbdiff.phar
- dbdiff.phar.gz
请随意将 dbdiff.phar 重命名为 dbdiff 并将其移动到 /usr/local/bin 或您选择的另一个目录。
如果您希望将其作为系统上的实用程序全局可用,也可以将其添加到系统路径中。
设置
请确保您处于以下所有步骤的应用程序根目录,使用 'cd' 命令在命令行中导航到您放置 "dbdiff" 文件夹的位置
我们假设 composer.phar 已安装在你的 "dbdiff" 文件夹内。如果它安装在其他地方,你需要使用它的确切路径
- 如果您没有使用
composer安装DBDiff,请使用以下命令安装项目的依赖项:php composer.phar install - 根据 文件示例 创建一个
.dbdiff文件,并将其放置在 "dbdiff" 目录的根目录下 - 输入
./dbdiff {dbdiff 命令,例如 server1.db1:server1.db2}以启动应用程序!有关可以运行的命令的更多详细信息,请参阅 命令行 API。
您应该会看到类似...
ℹ Now calculating schema diff for table `foo`
ℹ Now calculating data diff for table `foo`
ℹ Now generating UP migration
ℹ Now generating DOWN migration
ℹ Writing migration file to /path/to/dbdiff/migration.sql
✔ Completed
恭喜您已成功安装并运行 DBDiff!
命令行 API
注意:命令行参数将始终覆盖 .dbdiff 配置文件中的设置
- --server1=user:password@host1:port - 指定源数据库连接详情。如果只有一个服务器,可以省略 --server1 标志
- --server2=user:password@host2:port - 指定目标数据库连接详情(如果与 server1 不同)
- --template=templates/simple-db-migrate.tmpl - 指定输出模板(如果有的话)。默认将输出纯 SQL
- --type=schema 或 data 或 all - 指定要进行的差异类型,对架构、数据或两者。默认为 schema
- --include=up 或 down 或 all - 指定是否在输出中包含 up、down 或两者数据。默认为 up
- --nocomments=true - 默认情况下,输出文件将包含以 # 字符开始的自动注释,可以使用此参数将其删除
- --config=config.yaml - 默认情况下,DBDiff 会查找当前目录中的
.dbdiff文件,它是一个有效的 YAML 文件,也可以用一个配置文件来覆盖,该配置文件以 YAML 格式列出源和目标数据库的主机、用户、端口和密码(而不是使用命令行),或者任何其他设置,例如格式、模板、类型、包含、nocomments。请注意:命令行参数将始终覆盖任何配置文件。 - server1.db1.table1:server2.db2.table3 或 server1.db1:server2.db2 - 最后一个参数是要比较的内容。此工具可以比较数据库中的一个表或所有表(整个数据库)
- --output=./output-dir/today-up-schema.sql - 最后一个参数是一个输出文件和/或目录,用于输出差异,默认情况下,如果没有指定目录,将输出到命令运行的同一目录。如果指定了目录,则该目录必须存在,否则将引发错误。如果没有指定此路径,则默认文件名变为当前目录下的 migration.sql
使用示例
示例 1
$ ./dbdiff server1.db1:server2.db2
这将默认查找 DB 连接详情的 .dbdiff 配置文件,如果不存在,则工具将返回错误。如果存在,则使用连接详情来比较仅架构的 SQL,并在当前目录中输出一个带注释的 migration.sql 文件,默认情况下包含 only up SQL。
示例 2
使用方法:
$ ./dbdiff server1.development.table1:server2.production.table1 --nocomments=true --type=data
默认情况下,该工具会寻找 .dbdiff 配置文件来获取数据库连接详情,如果该文件不存在,则工具将返回错误。如果存在,将使用连接详情来比较每个数据库中指定表1的数据SQL,并在当前目录下输出一个.sql文件,该文件不含注释,并且默认只包含向上的SQL。
示例 3
$ ./dbdiff --config=config.conf --template=templates/simple-db-migrate.tmpl --include=all server1.db1:server2.db2 --output=./sql/simple-schema.sql
此命令不会寻找 .dbdiff,而是会寻找 config.conf(应为有效的YAML格式)来获取设置,并覆盖命令行参数中指定的 --template 和 --include 参数。因此,比较源数据库和目标数据库,并将名为 simple-schema.sql 的SQL文件输出到 ./sql 文件夹中,如果该文件夹不存在,程序将抛出错误。该文件将包括简单-db-migrate 格式的向上和向下SQL差异(如模板中指定)。此示例可以完美地与简单-db-migrate 工具配合使用。
文件示例
server1:
user: user
password: password
port: port # for MySQL this is 3306
host: host1 # usually localhost or 127.0.0.1
server2:
user: user
password: password
port: port # for MySQL this is 3306
host: host1 # usually localhost or 127.0.0.1
template: templates/simple-db-migrate.tmpl
type: all
include: all
nocomments: true
tablesToIgnore:
- table1
- table2
- table3
fieldsToIgnore:
table1:
- field1
- field2
- field3
table4:
- field1
- field4
.dbdiff
SQL_UP = u"""
{{ $up }}
"""
SQL_DOWN = u"""
{{ $down }}
"""
simple-db-migrate.tmpl
实际差异操作如何进行?
- 以下比较将按照以下顺序执行
- 当比较多个表时:应运行所有比较
当比较一个表与另一个表时:仅运行架构和数据比较
- 总体比较
- 检查两个数据库是否存在且可访问,如果不满足条件,则抛出错误
架构比较
- 检查列数、名称、类型、校对或属性是否有差异
- 在源数据库中存在而目标数据库中不存在的新列将被添加
数据比较
- 然后,按顺序比较每个表的表存储类型(例如 MyISAM,CSV)、校对(例如 utf8_general_ci)和行数。如果有任何差异,则记录下来,然后进行下一个测试
- 接下来,记录每个表中更改的行以及缺失的行
兼容迁移工具
如果您正在使用DBDiff以外的其他迁移工具,请告知我们,以便我们将其添加进来。
问题 & 支持 💭
- 到目前为止的文档就是您在这个页面上看到的文档,但是它将逐渐扩展到其自己的网站
- 如果您是公司或组织,并希望为DBDiff提供商业支持套餐,请联系我们
赞助者 💕
Sean McNamara
在Patreon上赞助DBDiff并让您的名字或标志在这里显著展示!
捐赠 💞
请在提交拉取请求之前阅读贡献指南。
感谢所有为DBDiff做出贡献的人!
反馈 💬
如果你已经来到这里,你可能是一位粉丝 😉
请抽出2分钟时间,对我们关于DBDiff的反馈
https://forms.gle/gjdJxZxdVsz7BRxg7
我们阅读每个通过的建议。