sqldef:一款免费的数据库变更管理工具

应用程序的升级通常伴随着数据库表结构的变更,为了维护各种环境的数据库变更,我们通常需要引入 Liquibase 或者 Flyaway 这样的数据库版本控制工具。不过,这类工具通常需要绑定某种编程语言,例如 Java;这次我们介绍一个新的工具:sqldef。

sqldef 是一个用于管理数据库模式结构的工具,可以用于比较两个数据库中的表结构差异并且生成可执行的 DDL 脚本。

sqldef 提供了命令行工具、WASM、NodeJS 等运行方式,支持的数据库包括 MySQL、PostgreSQL、SQLite 以及 SQL Server。

下载安装

sqldef 支持跨平台,包括 Linux、Windows、macOS。输入以下网址可以下载编译好的二进制文件:

https://github.com/sqldef/sqldef/releases

基于不同的操作系统和数据库下载对应的文件,例如 Windows 平台的 MySQL 数据库,文件名为 mysqldef_windows_amd64.zip。下载完成后解压得到可执行文件 mysqldef.exe。

PostgreSQL 对应的文件名为 psqldef_xxx,SQLite 对应的文件名为 sqlite3def_xxx,SQL Server 对应的文件名为 mssqldef_xxx。

使用案例

下面我们以 MySQL 数据库为例,演示以下如何使用 mysqldef:

bash 复制代码
# 确保 mysql 客户端可以连接数据库
PS C:\Users\bell-> mysql -uroot -p test -e "select 1;"
Enter password: ********
+---+
| 1 |
+---+
| 1 |
+---+

# 使用 mysqldef 工具导出数据库 test 的表结构
PS C:\Users\bell-> .\mysqldef.exe /u root /p xxxxxx /export test
CREATE TABLE `user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT 'NA',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

# 保存表结构到文件
PS C:\Users\bell-> .\mysqldef.exe /u root /p xxxxxx /export test > mysql_test.sql

其中,/u 用于指定用户名;/p 用户指定密码,需要将 xxxxxx 替换为实际值; /export 表示导出表结构;test 是数据库名称。更多的参数介绍可以通过帮助信息查看:

bash 复制代码
PS C:\Users\bell-> .\mysqldef.exe /help
Usage:
  C:\Users\bell-\mysqldef.exe [OPTIONS] [database|current.sql] < desired.sql

Application Options:
  /u, /user:user_name               MySQL user name (default: root)
  /p, /password:password            MySQL user password, overridden by $MYSQL_PWD
  /h, /host:host_name               Host to connect to the MySQL server (default: 127.0.0.1)
  /P, /port:port_num                Port used for the connection (default: 3306)
  /S, /socket:socket                The socket file to use for connection
      /ssl-mode:ssl_mode            SSL connection mode(PREFERRED,REQUIRED,DISABLED). (default: PREFERRED)
      /ssl-ca:ssl_ca                File that contains list of trusted SSL Certificate Authorities
      /password-prompt              Force MySQL user password prompt
      /enable-cleartext-plugin      Enable/disable the clear text authentication plugin
      /file:sql_file                Read desired SQL from the file, rather than stdin (default: -)
      /dry-run                      Don't run DDLs but just show them
      /export                       Just dump the current schema to stdout
      /enable-drop-table            Enable destructive changes such as DROP (enable only table drops)
      /skip-view                    Skip managing views (temporary feature, to be removed later)
      /before-apply:                Execute the given string before applying the regular DDLs
      /config:                      YAML file to specify: target_tables, skip_tables, algorithm, lock
      /help                         Show this help
      /version                      Show this version

打开生成的 mysql_test.sql 文件,增加一个字段 created_at 和索引 index_name:

sql 复制代码
CREATE TABLE `user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT 'NA',
  `created_at` DATETIME NOT NULL, -- 增加一个字段
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- 增加一个索引
CREATE INDEX user_name_idx USING BTREE ON test.`user` (name);

然后就可以运行 mysqldef 比较修改前后的表结构差异:

bash 复制代码
PS C:\Users\bell-> .\mysqldef.exe /u root /p xxxxxx /dry-run /file mysql_test.sql test
-- dry run --
ALTER TABLE `user` ADD COLUMN `created_at` datetime NOT NULL AFTER `name`;
CREATE INDEX user_name_idx USING BTREE ON test.`user` (name);

其中,/dry-run 表示只显示要执行的 DDL,但是不会实际执行。

我们去掉 /dry-run 参数,针对数据库执行差异 DDL:

bash 复制代码
PS C:\Users\bell-> .\mysqldef.exe /u root /p xxxxxx /file mysql_test.sql test
-- Apply --
ALTER TABLE `user` ADD COLUMN `created_at` datetime NOT NULL AFTER `name`;
CREATE INDEX user_name_idx USING BTREE ON test.`user` (name);

此时,数据库中已经应用了最新的 DDL,修改表结构。再次执行以上命令:

bash 复制代码
PS C:\Users\bell-> .\mysqldef.exe /u root /p root2024 /file mysql_test.sql test
-- Nothing is modified --

显示数据库结构没有更改。

其他数据库的示例可以参考 GitHub 上的项目文档:

https://github.com/sqldef/sqldef?tab=readme-ov-file

相关推荐
LucianaiB36 分钟前
【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
运维·数据库·人工智能·金仓数据库 2025 征文·数据库平替用金仓
时序数据说1 小时前
时序数据库IoTDB在航空航天领域的解决方案
大数据·数据库·时序数据库·iotdb
.生产的驴1 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
AnsenZhu1 小时前
2025年Redis分片存储性能优化指南
数据库·redis·性能优化·分片
oydcm2 小时前
MySQL数据库概述
数据库·mysql
oioihoii2 小时前
C++23中if consteval / if not consteval (P1938R3) 详解
java·数据库·c++23
带娃的IT创业者2 小时前
《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
数据库·人工智能
husterlichf3 小时前
MYSQL 常用数值函数 和 条件函数 详解
数据库·sql·mysql
我的golang之路果然有问题3 小时前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
卡皮巴拉爱吃小蛋糕4 小时前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql