27 个版本
0.11.4 | 2023年5月6日 |
---|---|
0.11.3 | 2021年6月15日 |
0.11.1 | 2021年4月11日 |
0.10.0 | 2020年11月17日 |
0.1.2 | 2019年3月17日 |
#224 在 数据库接口 中
77KB
2K SLoC
Movine
Movine 是一个简单的数据库迁移管理器,旨在与实际迁移工作兼容。许多迁移管理器会因复杂的迁移开发策略而变得混乱。通常,迁移管理器不会警告你 git 中保存的 SQL 与实际在数据库上运行的 SQL 不同。Movine 通过跟踪每个迁移的 up.sql
和 down.sql
的唯一哈希来解决此问题,并提供修复问题的工具。这使得用户可以轻松地跟踪其本地迁移历史是否与数据库上的匹配。
该项目目前处于早期阶段。
Movine 不旨在成为 ORM。如果您想要 ORM,请考虑使用 diesel。
迁移概念
Movine 跟踪数据库上迁移的四种不同状态。有基本的那些
- 已应用:在本地找到并已应用于数据库
- 挂起:在本地找到但尚未应用于数据库
然后还有更复杂的那些,这些正是 Movine 专门设计的来处理的
- 变体:在本地找到但数据库中应用了不同版本
- 分歧:在本地找不到但在数据库中应用
Short Asciinema 演示
一个 3.5 分钟的视频,展示了 Movine 提供的各种工具。
配置
开始使用 Movine 的第一步是设置配置。配置可以通过 movile.toml
文件或环境变量提供
使用配置文件
如果 Movine 找到名为 movine.toml
的配置文件,它将使用指定的参数。
[postgres]
host = {host}
database = {db}
user = {username}
password = {pass}
port = {port}
sslrootcert = {cert filename}
## Or use the Sqlite adaptor
[sqlite]
file={file}
## Or supply a database URL
database_url={url_string}
注意:当提供 database_url 时,SSLRootCert 目前无法工作。 注意:您应仅指定一种数据库类型的连接详细信息,否则 Movine 将隐式选择一个
环境变量
您可以使用PostgreSQL文档中描述的环境变量配置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
命令将运行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
命令将在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
命令将告诉您所有迁移的当前状态,包括本地和数据库上的。
$ 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
命令将运行所有挂起的迁移。您也可以使用-p
标志来显示迁移计划而不运行它。这对于所有修改数据库的命令都适用,并且有助于查看Movine是否会按照您的预期执行。
$ movine up -p
1. Up - 2019-03-17-163451_create_new_table
$ 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
$ 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
向下
down
命令将回滚最近的迁移。
$ movine down
$ 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
重做
redo
命令将回滚并重新应用最近应用的迁移或变体迁移。注意:如果最新的迁移是divergent
,则重做将简单地跳过它。请小心行事,并在需要修复divergent
迁移时运行fix
。
$ movine status
2019-03-17 16:34:51 UTC - Variant 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - Applied 1970-01-01-000000_movine_init
$ movine redo
$ 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
修复
fix
命令将回滚到没有分歧或变体迁移为止,然后应用所有迁移(除了启动时挂起的迁移)。
$ movine status
2019-03-17 16:41:07 UTC - Pending 2019-03-17-164107_create_another_table
2019-03-17 16:40:59 UTC - Divergent 2019-03-17-164059_modify_table
2019-03-17 16:34:51 UTC - Variant 2019-03-17-163451_create_new_table
1970-01-01 00:00:00 UTC - Applied 1970-01-01-000000_movine_init
$ movine fix
$ movine status
2019-03-17 16:41:07 UTC - Pending 2019-03-17-164107_create_another_table
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
自定义
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> {
// Same concept with a postgres connection!
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替代)
- 您认为跟踪变体或不同的迁移没有价值
依赖项
~32–48MB
~843K SLoC