使用 alembic 迁移或 docker 卷来填充 docker postgres 数据库?

Use alembic migration or docker volumes to populate docker postgres database?

我相信这个问题已经表明我是 docker 和 alembic 的新手。我正在使用 docker 和 postgres 构建一个 flask+sqlalchemy 应用程序。到目前为止,我还没有使用 alembic,但我正要将其插入,出现了一些问题。我将不得不创建一个 pg_trgm 扩展,并用我已有的数据填充其中一个表。到目前为止,我只使用 sqlalchemy 创建了全新的数据库进行测试。这就是我 thinking/doing:

  1. 要创建扩展,我可以简单地向 postgres docker 服务添加一个卷,例如:./pg_dump.sql:/docker-entrypoint-initdb。 d/pg_dump.sql。该扩展名不依赖于任何特定的数据库,因此一个简单的“如果不存在则创建扩展名 pg_trgm WITH SCHEMA public;”会做的,对吧?

  2. 如果我使用相同的策略来填充表,我需要一个 pg_dump.sql 来创建完整的数据库和表。为了实现这一点,我首先在 sqlalchemy 上创建了全新的数据库,然后我使用脚本将我在 json 文件中的数据填充到表中。然后我生成了完整的 pg_dump.sql,现在我可以将这个完整的 .sql 文件放在 docker 服务卷上,当我 运行 我的 docker-compose postgres 容器将准备好数据库。

  3. 现在我开始使用 alembic,我想我可以保留 pg_dump.sql 来创建扩展,并有一个 alembic 迁移脚本来填充空表(删除项目2 以上)。

哪种方式更好? 2、3 或 none 个? tks

/docker-entrypoint-initdb.d 脚本中创建扩展 (1)。使用应用程序的迁移系统加载数据 (3)。

从机制上讲,这样做的一个很好的理由是数据库初始化脚本仅在您第一次在给定存储上创建数据库容器时 运行。如果您向 table 添加列并需要 运行 迁移,则 init-script 序列要求您完全丢弃并重新创建数据库。

从哲学上讲,无论您使用的是 Docker 还是其他东西,我都会给您相同的答案。您可以想象 运行 在专用服务器上连接数据库,或者使用 cloud-hosted 数据库。您必须让您的数据库管理员为您安装扩展,但他们通常希望为您提供空数据库的凭据并让您自己加载数据;或者在云设置中,您可以想象在他们的控制台中选中“安装此扩展”复选框,但是如果不远程连接到数据库就无法加载数据。

因此,迁移系统将在您有权访问数据库的任何地方运行,并且允许对架构进行增量更改。初始化脚本设置是 Docker-specific 并且需要删除数据库才能进行任何更改。