2个版本
0.5.6 | 2024年1月22日 |
---|---|
0.5.3 | 2022年8月8日 |
在 数据库接口 中排名第902
34KB
550 行
postgres_migrator
postgres_migrator
允许您直接在 声明性SQL 中编写您的postgres架构,当您更改该声明性架构时,自动生成迁移,并应用这些迁移,同时进行严格的版本跟踪和一致性检查。
不再需要ORM! 直接使用postgres的全部功能,而无需手动编写迁移。
postgres_migrator
能够
- 自动通过比较迁移文件夹中的SQL与架构文件夹中的SQL来生成原始SQL迁移。
- 应用这些迁移并在数据库中保存迁移版本号,这样您就可以知道数据库应该处于什么状态。
- 对迁移进行一致性检查,以确保它们始终按生成顺序应用。这可以防止非常痛苦的调试和数据库损坏。
postgres_migrator
明确不执行以下操作
- 创建迁移的 "down" 版本。如果您想在生产中撤销某些操作,只需创建一个新的迁移(这本身就是最佳实践)。在开发中,只需强制数据库进入正确的状态。
- 只允许运行到某个特定版本的迁移。
postgres_migrator
将始终应用所有可用的未应用迁移。如果您不希望应用某些迁移,请将它们移动到不同的文件夹或更改它们的扩展名,使其不同于.sql
。 - 自己找出数据库差异,但内部使用已建立的
migra
。
示例
如果您的 schema
目录包含如下sql文件
create table fruit (
id serial primary key,
name text not null unique,
color text not null default ''
);
那么运行 postgres_migrator generate 'add fruit table'
将在 migrations
文件夹中生成一个名为 $new_version.$previous_version.add_fruit_table.sql
的迁移。
然后您可以通过运行 postgres_migrator migrate
来运行此迁移(以及任何其他尚未运行的迁移)。
如果您然后将架构SQL更改为以下内容
create type flavor_type as enum('SWEET', 'SAVORY');
create table fruit (
id serial primary key,
name text not null unique,
flavor flavor_type not null default 'SWEET'
);
然后运行 postgres_migrator generate 'remove color add flavor'
将生成 $new_version.$previous_version.remove_color_add_flavor.sql
文件,该文件将从上一个状态转换到新状态。
使用方法
首先,将您的声明式 SQL 文件放置在 schema
目录中,并为迁移创建一个名为 migrations
的目录。您可以使用 --schema-directory
和 --migrations-directory
来自定义这些设置。
作为独立 Docker 镜像
postgres_migrator
以 Docker 镜像形式分发,名称为 blainehansen/postgres_migrator
。您可以使用 docker run
运行它,由于 CLI 需要与 PostgreSQL 数据库交互、读取模式文件和读取/写入迁移文件,因此它需要很多选项。
docker run --rm -it --network host -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd):/working blainehansen/postgres_migrator <args>
为了使其更易于管理,您可以将其命令封装在函数、别名或脚本中。
function postgres_migrator {
local result=$(docker run --rm -it --network host -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd):/working -e PG_URL=$PG_URL blainehansen/postgres_migrator "$@")
echo $result
return $?
}
# or
alias postgres_migrator="docker run --rm -it --network host -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd):/working -e PG_URL=$PG_URL blainehansen/postgres_migrator"
# or in it's own executable file
docker run --rm -it --network host -u $(id -u ${USER}):$(id -g ${USER}) -v $(pwd):/working -e PG_URL=$PG_URL blainehansen/postgres_migrator "$@"
# now you can call it more cleanly
postgres_migrator generate 'adding users table'
postgres_migrator migrate
使用 Docker Compose
许多人将 PostgreSQL 作为 Docker Compose 设置中的一个服务运行,无论是使用 postgres
镜像还是类似 cloud-sql-proxy
的工具。
version: '3'
services:
postgres_migrator:
image: blainehansen/postgres_migrator
container_name: postgres_migrator
depends_on:
- db
environment:
- PG_URL=postgres://experiment_user:asdf@db:5432/experiment_db?sslmode=disable
volumes:
- .:/working/
tty: true
entrypoint: tail -F anything
db:
image: postgres:alpine
container_name: db
environment:
- POSTGRES_DB=experiment_db
- POSTGRES_USER=experiment_user
- POSTGRES_PASSWORD=asdf
ports:
- "5432:5432"
command: postgres -c 'max_wal_size=2GB'
如果它正在运行,以下命令应该可以工作
docker exec -it -u $(id -u ${USER}):$(id -g ${USER}) postgres_migrator postgres_migrator migrate
作为 Rust 二进制文件
此包发布在 crates.io 上,因此您可以使用 cargo install postgres_migrator
来安装它。
该包调用 migra
命令,因此必须安装并可运行。
CLI 使用方法
USAGE:
postgres_migrator [OPTIONS] --pg-url <PG_URL> <SUBCOMMAND>
OPTIONS:
-h, --help
Print help information
--pg-url <PG_URL>
postgres connection string, in the form postgres://user:password@host:port/database
can also be loaded from the environment variable PG_URL [env: PG_URL=]
--migrations-directory <MIGRATIONS_DIRECTORY>
directory where migrations are stored [default: migrations]
--schema-directory <SCHEMA_DIRECTORY>
directory where the declarative schema is located [default: schema]
-V, --version
Print version information
SUBCOMMANDS:
generate generate new migration and place in migrations folder
migrate apply all migrations to database
check checks that `source` and `target` are in sync, throws error otherwise
diff prints out the sql diff necessary to convert `source` to `target`
compact ensure both database and migrations folder are current with schema and compact
to only one migration
clean cleans the current instance of all temporary databases
help Print this message or the help of the given subcommand(s)
compact
是什么意思?
随着时间的推移,迁移文件夹可能会变得很大且难以管理,可能包含数百个迁移。随着时间的推移,这个长长的日志变得越来越没有用,尤其是对于小型团队。该 compact
命令用创建整个模式的单个迁移替换了所有迁移。
一些团队可能会认为这是危险的,并且是不必要的,他们可以自由选择不使用它!
致谢
migra
使比较模式成为可能。tusker
是使用临时数据库作为比较目标的灵感来源。《postgres_migrator》增加了生成和运行版本化迁移以及执行压缩的能力。- 感谢 Rust 如此出色!特别是 clap 和 rust-postgres 使这一切变得更容易。
贡献
欢迎拉取请求来使脚本更易于使用或更健壮。
依赖项
~12–23MB
~346K SLoC