1 个不稳定版本

0.1.0 2020年11月14日

#2925 in 数据库接口

Apache-2.0

115KB
2.5K SLoC

Oapth

CI crates.io Documentation License Rustc

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

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

命令行界面

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进行分析。

默认无功能

为了实际运行事务,必须指定所需的功能,否则您将获得一大堆不会做很多事情的代码。请参阅支持的后端

cargo install oapth-cli
oapth migrate # Will do nothing

支持的后端

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

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 固定时区

依赖关系

~7-26MB
~409K SLoC