1 个不稳定版本

0.1.0 2020年11月14日

#2627 in 数据库接口


用于 oapth-cli

Apache-2.0

97KB
2.5K SLoC

Oapth

CI crates.io Documentation License Rustc

通过SQL迁移提供数据库的灵活版本控制。支持嵌入和CLI工作流程的MS-SQL、MariaDB、MySQL、PostgreSQL和SQLite。

此项目已完全文档化,在部分目标上应用模糊测试,且不使用expectpanicunsafeunwrap

CLI

CLI应用程序期望一个配置文件,其中包含一组路径,其中每个路径都是一个包含多个迁移的目录。

migrations/1__initial
migrations/2__create_post

每个提供的迁移和组必须包含一个唯一的版本和一个名称,其结构如下

migrations
+-- 1__initial (Group)
    +-- 1__create_author.sql (Migration)
    +-- 2__create_post.sql (Migration)
+-- 2__fancy_stuff (Group)
    +-- 1__something_fancy.sql (Migration)
  • Group:一组必须也包含唯一版本和名称的迁移。
  • Migration:一个只能执行一次且不能修改的迁移。

SQL文件本身由两部分组成,一部分是迁移部分(-- oapth UP部分)和另一部分是回滚部分(-- oapth DOWN部分)。

-- oapth UP

CREATE TABLE author (
  id INT NOT NULL PRIMARY KEY,
  added TIMESTAMP NOT NULL,
  birthdate DATE NOT NULL,
  email VARCHAR(100) NOT NULL,
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL
);

-- oapth DOWN

DROP TABLE author;

迁移和迁移组之间的执行顺序由它们的数字声明顺序决定。

库允许自由地安排组,并使用arrayvecchronosiphash作为强制内部crate,这将为您的应用程序带来总共6个依赖项。如果这种行为不可接受,那么您可能应该放弃库,而是使用CLI二进制文件作为自定义部署策略的一部分。

// oapth = { features = ["with-sqlx-postgres", "with-sqlx-runtime-async-std"], version = "SOME_VERSION" }

use oapth::{Commands, Config, SqlxPostgres};
use std::path::Path;

#[async_std::main]
async fn main() -> oapth::Result<()> {
    let config = Config::with_url_from_default_var()?;
    let mut commands = Commands::new(SqlxPostgres::new(&config).await?);
    commands.migrate_from_dir(Path::new("my_custom_migration_group_path"), 128).await?;
    Ok(())
}

值得注意的是,这些强制依赖项可能已经作为瞬态部分包含在您的应用程序中。如有疑问,请检查您的Cargo.lock文件或使用cargo tree进行分析。

默认无功能特性

为了实际运行事务,有必要指定所需的功能,否则您将获得大量不会做太多的事情的代码。请参阅支持的 backs

cargo install oapth-cli
oapth migrate # Will do nothing

支持的backs

每个后端在库使用时都有一个可选的功能

oapth = { features = ["with-tokio-postgres"], version = "SOME_VERSION" }
  • Diesel(MariaDB/Mysql) - with-diesel-mssql
  • Diesel(PostgreSQL) - with-diesel-mysql
  • Diesel(SQLite) - with-diesel-postgres
  • mysql_async - with-mysql_async
  • rusqlite - with-rusqlite
  • SQLx(MariaDB/MySql) - with-sqlx-mysq
  • SQLx(MS-SQL) - with-sqlx-mssql
  • SQLx(PostgreSQL) - with-sqlx-postgres
  • SQLx(SQLite) - with-sqlx-sqlite
  • tiberius - with-tiberius
  • tokio-postgres - with-tokio-postgres

或者在安装CLI二进制文件时

cargo install oapth-cli --features "postgres"
  • mssql
  • mysql
  • postgres
  • sqlite

Diesel支持

仅支持迁移,并且模式打印仍在开发中。对于任何不受支持的用例,请使用官方的Diesel CLI二进制文件。

命名空间/模式

对于支持的数据库,没有直接的用户参数可以将迁移插入单个数据库模式中,但可以在SQL文件中指定模式,并按照最适合您的方式安排迁移组结构。

-- oapth UP

CREATE SCHEMA cool_department_schema;

CREATE TABLE cool_department_schema.author (
  id INT NOT NULL PRIMARY KEY,
  full_name VARCHAR(50) NOT NULL
);

-- oapth DOWN

DROP TABLE cool_department_schema.author;
DROP SCHEMA cool_department_schema;

迁移时区

对于PostgreSQL(除Diesel外),迁移时间戳以数据库中声明的时间区存储和检索。对于其他所有内容,时间戳为UTC。

后端 类型
Diesel(MariaDB/Mysql) UTC
Diesel(PostgreSQL) UTC
Diesel(SQLite) UTC
mysql_async UTC
rusqlite UTC
SQLx(MariaDB/MySql) UTC
SQLx(MS-SQL) UTC
SQLx(PostgreSQL) 固定时区
SQLx(SQLite) UTC
tiberius UTC
tokio-postgres 固定时区

依赖项

~1–23MB
~357K SLoC