如何在不丢失数据的情况下在 DEV 和 PROD 之间设置 Hasura 迁移

How to setup Hasura migrations between DEV and PROD without loosing data

我正在使用 hasura 迁移指南来同步两个服务器 - DEV 和 PROD。 在我们手动传输更改之前(如 'using UI to copy all the changes'),所以现在数据库相似度为 90%。

我们决定设置适当的迁移,但根据我的测试,进行初始同步需要 'clean slate'。

问题示例:

我们在 DEV 和 PROD 上都有用户 table。在 DEV 上有附加字段 age。 我们做

1 hasura migrate create --init(在开发中)

2 hasura migrate apply --endpoint PRODUCTION

我们收到错误 relation \"users\" already exists

问题是 - 我们如何在不先清理 PROD 的情况下同步数据库?

您目前收到该问题是因为 运行 migrate apply 正在尝试在已经存在的表上执行。

如果您使用 --skip-execution 标志,您可以在 PRODUCTION 环境中将所有相关迁移标记为已完成,并且 migrate apply 照常应用新迁移。

CLI 文档中提供了更多信息:
https://hasura.io/docs/latest/graphql/core/hasura-cli/hasura_migrate_apply.html


在 re-reading 之后要澄清的问题 - 使用 create --init 创建初始迁移将创建您现在的数据库快照(STAGINGPRODUCTION).

要在 STAGINGPRODUCTION 之间迁移,您需要手动更改创建的初始迁移以匹配暂存和生产,然后手动创建增量迁移以带来 PRODUCTION符合STAGING.

在此之后,如果您通过 CLI 使用 Hasura 控制台(使用 https://hasura.io/docs/latest/graphql/core/hasura-cli/hasura_console.html)——它将自动在目录中为您创建未来的增量迁移。


顺便说一句 - 您也可以使用 IF NOT EXISTS 手动创建弹性迁移(这些不会由 Hasura 自动创建,但您可以编辑它们的 SQL 文件迁移)。

例如:

ALTER TABLE users
ADD COLUMN IF NOT EXISTS age INT

编辑 2:我发现的另一个可能有用的工具是 Migra(用于 Postgres,在 Hasura 之外)。它可以帮助 diff-ing 您的开发和生产数据库,以帮助创建初始迁移状态:https://github.com/djrobstep/migra

有点隐蔽,但是关于迁移的部分涵盖了这种情况(您还没有 tracking/creating 迁移,现在需要第一次初始化它们):

https://hasura.io/docs/latest/graphql/core/migrations/migrations-setup.html#step-3-initialize-the-migrations-and-metadata-as-per-your-current-state

希望对您有所帮助 =)