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数据库接口

MIT 许可证

77KB
2K SLoC

Movine

Linux build status Crates.io

Movine 是一个简单的数据库迁移管理器,旨在与实际迁移工作兼容。许多迁移管理器会因复杂的迁移开发策略而变得混乱。通常,迁移管理器不会警告你 git 中保存的 SQL 与实际在数据库上运行的 SQL 不同。Movine 通过跟踪每个迁移的 up.sqldown.sql 的唯一哈希来解决此问题,并提供修复问题的工具。这使得用户可以轻松地跟踪其本地迁移历史是否与数据库上的匹配。

该项目目前处于早期阶段。

Movine 旨在成为 ORM。如果您想要 ORM,请考虑使用 diesel

迁移概念

Movine 跟踪数据库上迁移的四种不同状态。有基本的那些

  • 已应用:在本地找到并已应用于数据库
  • 挂起:在本地找到但尚未应用于数据库

然后还有更复杂的那些,这些正是 Movine 专门设计的来处理的

  • 变体:在本地找到但数据库中应用了不同版本
  • 分歧:在本地找不到但在数据库中应用

Short Asciinema 演示

一个 3.5 分钟的视频,展示了 Movine 提供的各种工具。

asciicast

配置

开始使用 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文档)。具体包括PGHOSTPGPORTPGDATABASEPGUSERPGPASSWORDPGSSLROOTCERT

您可以使用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.sqldown.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