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 |
|
#233 在 数据库接口 中
每月下载量 251 次
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或网站检索的内容
- Postgres:
DATABASE_TOKEN
- 仅在您使用
Turso
和LibSQL
并需要令牌进行认证的情况下。如果没有指定,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