#postgresql #database-schema #migration #generator #manager #schema-version #raw-sql

app postgres_migrator

简单的postgres原始SQL迁移生成器和管理者

2个版本

0.5.6 2024年1月22日
0.5.3 2022年8月8日

数据库接口 中排名第902

MIT 许可证

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 如此出色!特别是 claprust-postgres 使这一切变得更容易。

贡献

欢迎拉取请求来使脚本更易于使用或更健壮。

依赖项

~12–23MB
~346K SLoC