#postgresql #database-migrations #migration #schemamama

schemamama_postgres

为Schemamama迁移系统提供的PostgreSQL适配器

16个版本

使用旧的Rust 2015

0.3.0 2020年3月15日
0.2.3 2018年12月13日
0.2.2 2018年4月19日
0.2.1 2017年11月20日
0.0.3 2015年6月5日

#1938 in 数据库接口

Download history 20/week @ 2024-04-01 4/week @ 2024-05-27 90/week @ 2024-07-15

90 每月下载量

MIT 许可证

8KB
75

PostgreSQL for Schemamama

为轻量级数据库迁移系统Schemamama提供的PostgreSQL适配器。依赖于postgres crate。

安装

如果你使用Cargo,只需将Schemamama添加到你的Cargo.toml

[dependencies]
schemamama = "0.3"
schemamama_postgres = "0.2"
postgres = "0.15"

使用

首先,定义一些迁移

#[macro_use]
extern crate schemamama;
extern crate schemamama_postgres;
extern crate postgres;

use schemamama::{Migration, Migrator};
use schemamama_postgres::{PostgresAdapter, PostgresMigration};

struct CreateUsers;
// Instead of using sequential numbers (1, 2, 3...), you may choose to use a collaborative
// versioning scheme, such as epoch timestamps.
migration!(CreateUsers, 1, "create users table");

impl PostgresMigration for CreateUsers {
    fn up(&self, transaction: &postgres::Transaction) -> Result<(), PostgresError> {
        transaction.execute("CREATE TABLE users (id BIGINT PRIMARY KEY);", &[]).map(|_| ())
    }

    fn down(&self, transaction: &postgres::Transaction) -> Result<(), PostgresError> {
        transaction.execute("DROP TABLE users;", &[]).map(|_| ())
    }
}

struct CreateProducts;
migration!(CreateProducts, 2, "create products table");

impl PostgresMigration for CreateProducts {
    // ...
}

然后,运行迁移!

let url = "postgres://postgres@localhost";
let connection = postgres::Connection::connect(url, &SslMode::None).unwrap();
let adapter = PostgresAdapter::new(&connection);
// Create the metadata tables necessary for tracking migrations. This is safe to call more than
// once (`CREATE TABLE IF NOT EXISTS schemamama` is used internally):
adapter.setup_schema();

let mut migrator = Migrator::new(adapter);

migrator.register(Box::new(CreateUsers));
migrator.register(Box::new(CreateProducts));

// Execute migrations all the way upwards:
migrator.up(None);
assert_eq!(migrator.current_version(), Some(2));

// Reverse all migrations:
migrator.down(None);
assert_eq!(migrator.current_version(), None);

测试

要运行cargo test,你必须在本地运行PostgreSQL,并且有一个名为postgres的用户角色,具有访问名为postgres的数据库的登录权限。所有测试将在pg_temp模式中运行,因此数据库不会被修改。

待办事项

  • 使元数据表名可配置(当前固定为schemamama)。

依赖项

~7–16MB
~234K SLoC