21 个版本 (稳定版)

1.0.14 2024年7月30日
1.0.10 2024年6月30日
1.0.1 2024年3月3日
0.0.11 2024年2月21日
0.0.4 2023年12月29日

#233数据库接口

Download history 153/week @ 2024-04-27 7/week @ 2024-05-04 7/week @ 2024-05-18 2/week @ 2024-05-25 101/week @ 2024-06-08 208/week @ 2024-06-15 270/week @ 2024-06-22 426/week @ 2024-06-29 29/week @ 2024-07-06 2/week @ 2024-07-13 38/week @ 2024-07-20 198/week @ 2024-07-27 15/week @ 2024-08-03

每月下载量 251 次

MIT 许可协议

110KB
3K SLoC

Geni

Geni 是一款独立的迁移工具,旨在与您选择的 ORM/工具包/代码库协同工作。它允许多个开发者协作而不会覆盖数据库迁移。它可以与您的代码一起在 CD 流中运行,以确保数据库保持最新。

该项目受到了 dbmate 的极大启发,并因其缺乏对 LibSQL 的支持而创建。

该应用程序使用 Rust 编程语言开发,并依赖于 libsql-client-rs 库用于 SQLite 和 LibSQL。此外,它使用 SQLX 来支持 Postgres、MariaDB 和 MySQL 数据库。由于它是用 Rust 编写的,因此它非常快,速度极快,体积小巧,超快速且内存安全。

Geni 新闻

功能

  • 数据库
    • Postgres
    • MariaDB
    • MySQL
    • SQLite
    • LibSQL
  • 使用 geni new **name** 生成迁移
  • 使用 geni up 迁移
  • 使用 geni down 回滚
  • 使用 geni create 创建数据库
  • 使用 geni drop 删除数据库
  • 基于时间戳的迁移
  • 在事务中运行迁移
  • 状态命令以查看待应用的迁移
  • 每次迁移后导出 schema.sql,可用于版本控制
    • 导出需要其他二进制文件才能工作
      • Postgres:无需其他二进制文件即可工作。使用 SQL 代码获取模式
      • MySQL:需要安装 mysqldump(已安装在 docker 中)
      • MariaDB:需要安装 mariadb-dump(已安装在 docker 中)
      • SQLite:无需其他二进制文件即可工作。使用 SQL 代码获取模式
      • LibSQL: 无需其他二进制文件即可运行。使用SQL代码获取架构

待办事项

  • 数据库
    • ClickHouse

安装

GitHub

$ sudo curl -fsSL -o /usr/local/bin/geni https://github.com/emilpriver/geni/releases/latest/download/geni-linux-amd64
$ sudo chmod +x /usr/local/bin/geni

Homebrew

brew install geni

Scoop

待定

PKGX

使用PKGX运行

pkgx geni up

Nix flake

使用nix运行

nix run github:emilpriver/geni -- up

Cargo

cargo install geni

Docker

Docker镜像已发布到GitHub容器注册中心(ghcr.io/emilpriver/geni)。

$ docker run --rm -it --network=host ghcr.io/emilpriver/geni:latest --help

还有一个精简的Docker镜像,它没有各自数据库的库(例如pg_dump)。

注意: 此镜像不会尝试转储数据库

$ docker run --rm -it --network=host ghcr.io/emilpriver/geni:latest-slim --help

如果您希望创建或应用迁移,您需要使用Docker的绑定挂载功能,以便将您的本地工作目录(pwd)在geni容器内可用

$ docker run --rm -it --network=host -v "$(pwd)/migrations:/migrations" ghcr.io/emilpriver/geni:latest new create_users_table`

命令

geni new    # Generate a new migrations file
geni up     # Run any pending migration
geni down   # Rollback migrations, use --amount to speify how many migrations(default 1)
geni create # Create the database, only works for Postgres, MariaDB and MySQL. If you use SQLite will geni create the file before running migrations if the sqlite file don't exist. LibSQL should be create using respective interface.
geni drop   # Remove database
geni status # Print pending migrations
geni help   # Print help message

环境变量

  • DATABASE_MIGRATIONS_FOLDER
    • 指定geni应查找以运行迁移的位置。
    • 默认: ./migrations
  • DATABASE_URL
    • geni应使用的数据库URL以进行迁移
    • 示例
      • Postgres:DATABASE_URL="postgres://[email protected]:5432/app?sslmode=disable"
      • MySQL: mysql://root:password@localhost:3307/app
      • MariaDB: mariadb://root:password@localhost:3307/app
      • Sqlite: sqlite://./database.sqlite
      • LibSQL: https://127.0.0.1:6000
        • LibSQL的协议是https。
        • 对于turso的使用:这是您可以使用Turso CLI或网站检索的内容
  • DATABASE_TOKEN
    • 仅在您使用TursoLibSQL并需要令牌进行认证的情况下。如果没有指定,Geni将尝试迁移而不进行任何认证
  • DATABASE_WAIT_TIMEOUT
    • geni尝试迁移之前等待的时间。如果您数据库需要一些时间来启动,这将很有用
    • 默认: 30
  • DATABASE_SCHEMA_FILE
    • 架构迁移文件的名称
  • DATABASE_MIGRATIONS_TABLE
    • 要运行迁移的表名称

用法

创建新的迁移

运行

DATABASE_URL="x" geni new hello_world

将在控制台中写入路径的2个文件。一个以.up.sql结尾,另一个以.down.sql结尾。 .up.sql用于创建迁移,而.down.sql用于回滚迁移。这意味着.down.sql应包含可以回滚到.up.sql中添加的更改的信息。

示例

如果我想创建名为Persons的表,我应该将以下内容添加到.up.sql

CREATE TABLE Persons (
    PersonID int
)

然后回滚迁移应如下所示

DROP TABLE Persons;

在生成的.down.sql文件中,此代码将撤销创建表Persons

事务

Geni 默认始终在事务中运行,但如果你想防止使用事务,请在迁移文件的第一行添加 transaction: no。然后 Geni 不会为特定迁移使用事务。这对向上和向下迁移都适用。

示例

-- transaction:no
CREATE TABLE table_2 (
  id INT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

运行迁移

可以使用以下方式运行迁移

geni up

回滚迁移

可以使用以下方式回滚最近添加的迁移

geni down

如果你想要回滚超过 1 个迁移,可以在 CLI 中添加 -a 来指定数量

geni down -a 3

从 CLI 运行

DATABASE_URL="postgres://[email protected]:5432/app?sslmode=disable" geni up

Github 工作流

- uses: emilpriver/geni@main
  with:
    migrations_folder: "./migrations"
    wait_timeout: "30"
    migrations_table: "schema_migrations"
    database_url: "https://127.0.0.1:3000"
    database_token: "X"

参数

  • migrations_folder(可选):存放迁移文件的路径。
    • 默认:./migrations
  • wait_timeout(可选):在放弃尝试连接到数据库之前的等待时间
    • 默认:30
  • migrations_table(可选):迁移表的名称
    • 默认:schema_migrations
  • database_url(必需):访问数据库的 URL
  • database_token(可选):用于向 Turso 进行身份验证的令牌。只有在你需要身份验证时才需要
    • 默认:""

在 CI/CD 中运行

在 CI/CD 中,数据库_url 应该来自安全存储库,并作为环境变量 DATABASE_URL 添加。如果提供了 DATABASE_URL 环境变量,那么你只需要运行一个命令来生成迁移。

geni up

来运行迁移。

将 Geni 作为库运行

Geni 也可以作为库使用。

所有公开的功能都可以在 库示例文件夹 中找到

use geni;

#[tokio::main]
async fn main() {
    // Migrate the database
    geni::migrate_database(
        "sqlite://./test.db".to_string(), // Database URL
        None,                             // Database Token
        "migrations".to_string(),         // Migration Table
        "./migrations".to_string(),       // Migration Folder
        "schema.sql".to_string(),         // Schema File
        Some(30),                         // Wait timeout for the database to be ready
        false,                            // Dump Schema
    )
    .await
    .unwrap();

    ()
}

依赖项

~42–57MB
~1M SLoC