注意:本项目不再积极维护。它最初只是一个概念验证,我一直没有时间去适当地修复它,也不打算这样做。请自行承担使用风险,我仍会不时查看并合并修复。
Movine
Movine 是一个简单的数据库迁移管理器,旨在与现实世界的迁移工作兼容。许多迁移管理器在处理复杂的迁移开发策略时会感到困惑。通常,迁移管理器不会警告你 Git 中保存的 SQL 与实际在数据库上运行的内容是否不同。Movine 通过跟踪每个迁移的 up.sql
和 down.sql
的唯一哈希值来解决这个问题,并提供修复问题的工具。这使用户能够轻松跟踪他们的本地迁移历史是否与数据库上的匹配。
该项目目前处于早期阶段。
Movine 并不旨在成为一个 ORM。如果你想要 ORM,可以考虑使用 diesel。
迁移概念
Movine 在数据库上跟踪四种不同的迁移状态。基本的状态有:
- 已应用:在本地找到并应用到数据库
- 待处理:在本地找到但未应用到数据库
然后是更复杂的状态,Movine 专门设计用来处理这些情况:
- 变体:在本地找到但数据库上应用了不同版本
- 偏离:在本地未找到但已应用到数据库
简短的 Asciinema 演示
一个 3.5 分钟的视频,展示了 Movine 提供的各种工具。
配置
使用 Movine 的第一步是设置配置。配置可以通过 movile.toml
文件或环境变量提供:
使用配置文件
如果 Movine 找到名为 movine.toml
的配置文件,它将使用指定的参数。
[postgres]
host = {主机}
database = {数据库}
user = {用户名}
password = {密码}
port = {端口}
sslrootcert = {证书文件名}
## 或使用 Sqlite 适配器
[sqlite]
file={文件}
## 或提供数据库 URL
database_url={url字符串}
注意:当提供 database_url 时,SSLRootCert 目前不起作用。 注意:你应该只为一种数据库类型指定连接详情,否则 Movine 将隐式选择一个
环境变量
你可以使用 PostgreSQL 文档中描述的环境变量配置 PostgreSQL 适配器。具体支持 PGHOST
、PGPORT
、PGDATABASE
、PGUSER
、PGPASSWORD
和 PGSSLROOTCERT
。
你可以使用 SQLITE_FILE
环境变量配置 SQLite 适配器。
最后,你还可以提供 DATABASE_URL
环境变量。
注意:使用数据库 URL 时,SSLRootCert 不起作用。
Movine 支持使用 .env
文件作为配置源。
初始化
接下来,你可以运行 init
命令进行设置,使用 generate
命令创建第一个迁移,一旦编写完成,你可以运行 up
来应用它们。
$ movine init
$ tree migrations/
migrations/
└── 1970-01-01-000000_movine_init
├── down.sql
└── up.sql
1 directory, 2 files
$ movine generate create_new_table
$ tree migrations/
migrations/
├── 1970-01-01-000000_movine_init
│ ├── down.sql
│ └── up.sql
└── 2019-03-17-163451_create_new_table
├── down.sql
└── up.sql
2 directories, 4 files
$ movine up
$ movine status
2019-03-17 16:34:51 UTC - Applied 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - Applied 1970-01-01-000000_movine_init
命令
Movine 使用几个命令,所有命令都可以通过在命令行使用 --help
列出。
Init
init
命令将运行 Movine 的初始化程序,它会在数据库上创建一个表来跟踪迁移,并创建一个本地迁移文件夹。
$ movine init
$ ls
migrations/ movine.toml
$ tree migrations/
migrations/
└── 1970-01-01-000000_movine_init
├── down.sql
└── up.sql
1 directory, 2 files
$ psql $PARAMS -c "\d"
List of relations
Schema | Name | Type | Owner
--------+--------------------------+----------+--------
public | movine_migrations | table | movine
public | movine_migrations_id_seq | sequence | movine
Generate
generate
命令将在 migrations/
目录中生成一个带有当前日期和给定名称的文件夹,其中包含空白的 up.sql
和 down.sql
文件。
$ movine generate create_new_table
$ tree migrations/
migrations/
├── 1970-01-01-000000_movine_init
│ ├── down.sql
│ └── up.sql
└── 2019-03-17-163451_create_new_table
├── down.sql
└── up.sql
2 directories, 4 files
Status
status
命令将告诉你所有迁移的当前状态,包括本地和数据库上的。
$ movine status
2019-03-17 16:34:51 UTC - Pending 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - Applied 1970-01-01-000000_movine_init
Up
up
命令将运行所有待处理的迁移。你也可以使用 -p
标志来显示迁移计划而不运行它。这适用于所有修改数据库的命令,对于查看 Movine 是否会按预期执行很有用。
$ movine up -p
1. 升级 - 2019-03-17-163451_create_new_table
$ movine status
2019-03-17 16:34:51 UTC - 待处理 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
$ movine up
$ movine status
2019-03-17 16:34:51 UTC - 已应用 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
回滚
down
命令将回滚最近的迁移。
$ movine down
$ movine status
2019-03-17 16:34:51 UTC - 待处理 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
重做
redo
命令将回滚然后重新应用最近应用的迁移或变体迁移。
注意:如果最新的迁移是发散
的,那么重做将直接跳过它。请小心,如果你想修复发散
的迁移,请运行fix
。
$ movine status
2019-03-17 16:34:51 UTC - 变体 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
$ movine redo
$ movine status
2019-03-17 16:34:51 UTC - 已应用 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
修复
fix
命令将回滚所有内容,直到没有发散或变体迁移,然后应用所有迁移,_除了_开始时待处理的迁移。
$ movine status
2019-03-17 16:41:07 UTC - 待处理 2019-03-17-164107_create_another_table
2019-03-17 16:40:59 UTC - 发散 2019-03-17-164059_modify_table
2019-03-17 16:34:51 UTC - 变体 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
$ movine fix
$ movine status
2019-03-17 16:41:07 UTC - 待处理 2019-03-17-164107_create_another_table
2019-03-17 16:34:51 UTC - 已应用 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - 已应用 1970-01-01-000000_movine_init
自定义
custom
命令将允许你指定自己的迁移策略(如果Movine不够智能)。注意:这目前尚未实现
库的使用
注意:虽然Movine
的实现目前是稳定的,但config
API可能会有变动(特别是辅助函数)。请告诉我任何反馈!
Movine可以作为库这样使用(使用辅助函数加载数据库连接):
use movine::{Movine, Config};
use movine::errors::Error;
fn main() -> Result<(), Error> {
let config = Config::load(&"movine.toml")?;
let mut conn = config.into_sqlite_conn();
let mut movine = Movine::new(&mut conn);
movine.up()?;
Ok(())
}
或者如果你已经有了连接:
use movine::{Movine, Config};
use movine::errors::Error;
fn main() -> Result<(), Error> {
// 对于postgres连接也是相同的概念!
let mut conn = rusqlite::Connection::open("file.db")?;
let mut movine = Movine::new(&mut conn);
movine.up()?;
Ok(())
}
为什么你应该使用Movine
- 你接受使用1.0版本前软件的风险
- 你想为你的迁移编写原始SQL
- 你有一个由多个开发人员开发迁移的共享数据库
- 你想要一个适合开发人员使用的迁移管理解决方案
为什么你不应该使用Movine
- 你想要长期经过战斗测试的数据库迁移管理器
- 你想要ORM集成(考虑使用diesel代替)
- 你不认为跟踪变体或发散迁移有价值