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

相关推荐
斯特凡今天也很帅4 分钟前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
超级小忍1 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税2 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy2 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之3 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗3 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存
洛神灬殇4 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构
小鸡脚来咯4 小时前
redis分片集群架构
数据库·redis·架构
christine-rr5 小时前
征文投稿:如何写一份实用的技术文档?——以软件配置为例
运维·前端·网络·数据库·软件构建
海尔辛5 小时前
SQL 基础入门
数据库·sql