Shmig:用bash编写的数据库迁移工具

2020-09-29 04:53:37

$CD SHMIG$make install$cd$HOME$mkdir Migrations$shmig-t sqlite3-d test.db create mytable Generated。/Migrations/1470490964-mytable.sql$cat./Migrations/1470490964-mytable.sql--迁移:mytable--创建于:2016-08-06 09:42:44-=BEGIN;PRAGMA FOREIGN_KEYS=ON;COMMIT;--=DOWN=BEGIN;COMMIT;$#在正常使用时,您会将sql添加到此迁移文件中。$shmig-tsqlite3-d test.db迁移shmig:创建迁移表:shmig_version shmig:正在应用Mytable';(1470490964)...。已完成$ls-l test.db-rw-r--r--1标记人员12288 8月6日09:41 test.db$shmig-t sqlite3-d test.db回滚shmig:还原';mytable';(1470490964)...。完成$shmig-h|wc-l 73$。

如果您不喜欢默认的SQL模板,请编辑shmig中的函数sqlite3_up_text()和sqlite3_down_text()。

目前有很多数据库迁移工具,如DBV、Liquibase、sqitch、Flyway和其他特定于框架的工具(针对Ruby on rails、Yii、Laravel等)。但它们都相当重,有很多依赖项(甚至在堆栈之外无法使用),有些拥有自己的DSL……。

我需要一些简单、可靠、依赖性最小的解决方案,并且能够针对不同的数据库(PostgreSQL、MySQL、SQLite3)在几乎任何与POSIX兼容的环境中运行。

RDM与其控制台客户端捆绑在一起。MySQL有MySQL,PostgreSQL有psql,SQLite3有sqlite3。还有那个坐着!这对于在批处理模式下使用任何驱动程序或连接器与数据库进行交互就足够了。

使用客户端选项,可以使其输出适合于使用标准UNIX文本处理工具(sed、grep、awk等)进行批处理。这足以实现简单的迁移系统,该系统将用数据库存储当前模式版本信息(请参见shmi.conf.example中的SCHEMA_TABLEVARIABLE)。

Shmig尝试从当前工作目录中的配置文件shmi.conf读取配置。示例配置文件是shmic.conf.example。

您还可以通过创建文件shmil.local.conf来提供可选的配置覆盖文件。这允许您提供与项目一起受版本控制的默认配置,然后指定可用于提供特定于实例的配置的非版本控制的本地配置文件。(另一种选择是使用环境变量,尽管有些人更喜欢使用具体的文件作为环境变量。)。这甚至适用于使用-c选项指定的自定义配置文件。

您还可以从命令行或使用环境变量配置shmig。命令行设置的优先级高于配置文件或环境设置。

要简化使用,请使用您的配置指令在项目根目录中创建shmi.conf。当您在该目录中shmig;action>;...时,shmig将使用该文件中的配置。

迁移是名称以";<;UNIX时间戳>;-";结束于";.sql";的SQL文件。应用新迁移的顺序由文件名中的秒自纪元时间戳确定,最早的迁移首先进行。

每个迁移包含两个特殊标记:--=UP=标记应用迁移时将执行的节的开始,以及--=DOWN=标记恢复迁移时将执行的节的开始。

--迁移:创建用户表--创建时间:2013-10-02 07:03:11--=up=创建表`users`(id int NOT NULL PRIMARY KEY AUTO_INCREMENT,name varchar(32)NOT NULL,Email varchar(255)NOT NULL);在`users`(`email`)上创建唯一索引`USERS_EMAIL_uq`;--=DOWN=DROP TABLE`users`;

应用迁移时,将执行--=up=直到--=down=之间的所有内容,恢复迁移时将执行--=down=至文件末尾之间的所有内容。如果迁移缺少标记或标记的内容为空,则相应的操作将失败(即,如果您重新尝试恢复没有或为空的迁移--=Down=标记您将收到错误消息,并且脚本不会执行任何迁移带错误的脚本)。还要注意那些以分号结尾的语句。它们是必需的,因为您基本上是在将它们键入数据库CLI客户端。

Liquibase的一个很好的特性是上下文,它用于根据环境实现不同的行为;例如,在开发环境中可以插入测试数据。

Shmig可以通过符号链接来支持这一点。例如,假设您的生产迁移处于生产阶段,而测试数据处于测试阶段:

.└──Migrations├──Prod│└──1485643154-Create_table.sql└──TEST└──1485648520-testdata.sql。

.└──Migrations├──Prod│└──1485643154-Create_table.sql└──测试├──1485643154-Create_Table.sql->;../Prod/1485643154-Create_Table.sql└──1485648520-testdata.sql。

在将迁移应用于测试时,通过命令行或使用本地配置覆盖文件将shmig指向测试目录。

密码通过环境变量传递给MySQL和psql。如果您的系统允许其他用户读取属于其他用户的进程环境,这可能是一个安全问题。在大多数带有现代内核的Linux发行版中,这是被禁止的。您可以像这样检查(在支持/proc文件系统的系统上):cat/proc/1/env-如果您得到权限被拒绝的错误,那么您将重新确保安全。

因为shmig只是一个shell脚本,所以它不是速度冠军。每次执行一条语句都会产生新的客户端进程。我没有遇到太多关于速度的问题,但是如果您有这样的问题,请将问题归档,也许我会详细介绍一下。

Docker run-e password=root-e host=MariaDB-v$(Pwd)/Migrations:/sql--link MariaDB:MariaDB mkbucc/shmig:Latest-t mysql-d db-name up。

目前,NixOS在Linux和Darwin上支持Shmig,从18.03开始可以通过运行nix-env-IA nixos.shmig将该软件包安装到用户的配置文件中。

*非常欢迎对其他系统的贡献,并可通过PR提交给本次回购。

一种仅派生一个CLI客户端的方法。可能与FIFO和SIGCHLD处理程序有关。