Project Icon

movine

实用的开源数据库迁移版本控制系统

Movine是一个开源的数据库迁移管理工具,专注于解决实际开发中的复杂迁移问题。它通过跟踪迁移文件的唯一哈希值,确保Git中的SQL与数据库执行的SQL保持一致。支持PostgreSQL和SQLite,Movine提供迁移初始化、生成、状态查看和执行等功能,并能处理变体和分歧迁移,为团队协作提供可靠的数据库版本控制方案。

注意:本项目不再积极维护。它最初只是一个概念验证,我一直没有时间去适当地修复它,也不打算这样做。请自行承担使用风险,我仍会不时查看并合并修复。

Movine

Linux 构建状态 Crates.io

Movine 是一个简单的数据库迁移管理器,旨在与现实世界的迁移工作兼容。许多迁移管理器在处理复杂的迁移开发策略时会感到困惑。通常,迁移管理器不会警告你 Git 中保存的 SQL 与实际在数据库上运行的内容是否不同。Movine 通过跟踪每个迁移的 up.sqldown.sql 的唯一哈希值来解决这个问题,并提供修复问题的工具。这使用户能够轻松跟踪他们的本地迁移历史是否与数据库上的匹配。

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

Movine 并不旨在成为一个 ORM。如果你想要 ORM,可以考虑使用 diesel

迁移概念

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

  • 已应用:在本地找到并应用到数据库
  • 待处理:在本地找到但未应用到数据库

然后是更复杂的状态,Movine 专门设计用来处理这些情况:

  • 变体:在本地找到但数据库上应用了不同版本
  • 偏离:在本地未找到但已应用到数据库

简短的 Asciinema 演示

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

asciicast

配置

使用 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 适配器。具体支持 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

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.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

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代替)
  • 你不认为跟踪变体或发散迁移有价值
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号