movine

movine

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

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

Movine数据库迁移SQL版本控制命令行工具Github开源项目

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

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代替)
  • 你不认为跟踪变体或发散迁移有价值

编辑推荐精选

GPT Plus|Pro充值

GPT Plus|Pro充值

GPT充值

支持 ChatGPT Plus / Pro 充值服务,支付便捷,自动发货,售后可查。

GPT Image 2中文站

GPT Image 2中文站

AI 图片生成平台

GPT Image 2 是面向用户的 AI 图片生成平台,支持文生图、图生图及多模型创意工作流。

Vecbase

Vecbase

你的AI Agent团队

Vecbase 是专为 AI 团队打造的智能工作空间,将数据管理、模型协作与知识沉淀整合于一处。算法、产品与业务在同一平台无缝协同,让从数据到 AI 应用的落地更快一步。

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

QoderWork

QoderWork

阿里Qoder团队推出的桌面端AI智能体

QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

nano-banana纳米香蕉中文站

nano-banana纳米香蕉中文站

国内直接访问,限时3折

输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

下拉加载更多