【问题标题】:How to run Prisma schema update without erasing the PostgreSQL data?如何在不删除 PostgreSQL 数据的情况下运行 Prisma 模式更新?
【发布时间】:2022-02-24 18:01:51
【问题描述】:

我有一个 Nest.Js / Prisma 应用程序使用的 PostgreSQL 数据库。

我们更改了 Prisma 架构中一个字段的名称并添加了一个新字段。

现在,当我们要更新 PostreSQL 结构时,我正在运行 as suggested by Prisma,以下命令:

npx prisma generate 

然后

npx prisma migrate dev --name textSettings-added --create-only

我们的想法是在实际进行迁移之前使用--create-only 标志来检查迁移。

但是,当我运行它时,我会得到一个要对数据库进行更改的列表和以下消息:

 We need to reset the PostgreSQL database "my_database" at "my_db_name@cluster.us-east-1.rds.amazonaws.com:5432".
Do you want to continue? All data will be lost.

我当然选择不继续,因为我不想丢失数据。经过检查,我发现迁移文件实际上包含我只想修改的表的DROP TABLE。如何避免?

那么如何在不影响数据的情况下运行更新呢?

更新: 我看到使用--create-only 运行会创建一个迁移,然后可以使用prisma migrate dev 在数据库级别上实现该迁移,但是,在该迁移文件中,由于内部有一些新参数,仍然有一些命令删除了我以前的表。如何在不删除 PostgreSQL 数据的情况下运行 prisma 迁移?

更新 2: 我不希望 Prisma 在我刚刚更新它们时丢弃我的表。但是,生成的迁移文件会删除它们然后更改它们。你知道避免这种下降的最佳程序是什么吗?我在某处看到我可以先使用新选项手动更新数据库,然后运行迁移,这样 Prisma 可以找到更新它的方法,但这对我来说似乎过于手动......也许还有其他想法?

【问题讨论】:

    标签: postgresql prisma


    【解决方案1】:

    可能是 Prisma 错误:https://github.com/prisma/prisma/issues/8053

    我最近也有这种情况。如果您只想创建迁移文件,它可能不应该尝试运行迁移。

    但总体而言,Prisma 有时会重新创建您的数据库。如果您的迁移中断,那么在应用数据时无论如何都需要重置数据。

    我建议您创建一些种子脚本,这样您就可以不断地重新创建数据库状态,这对您的开发环境非常有用。

    More info

    【讨论】:

    • 谢谢。好吧,我实际上在一些表上添加了一些新属性,只是想运行迁移来更新我的 PostgreSQL。但是,Prisma 迁移文件坚持删除这些表。你知道如何避免这种情况吗?
    • 好吧,如果您添加了一些属性并且它们不是可选的(不可为空)并且没有默认值,那么唯一的选择是删除表,否则它将无效(因为旧行不会拥有他们)。这是发生了什么事还是你做了其他事情?
    • 它们确实有默认值,但我想我首先需要检查现有记录并用这些新的默认值填充它们?或者 Prisma 在添加该属性时应该自动执行此操作?
    • 是的,Prisma 应该使用默认值创建迁移。如果您的所有字段都确实有默认值或者是可选的,那么这是一个错误。
    【解决方案2】:

    对于某些情况,例如重命名表或列,如果 Prisma 生成的迁移文件已经包含数据,则需要更新它们。

    如果这适用于您的用例,Prisma's docs 建议:

    1. 更新 prisma 架构
    2. 创建迁移文件而不应用它(--create-only 标志)
    3. 更新迁移脚本以删除丢弃,改为编写您的自定义查询(例如RENAME <table_name> TO <new_name>
    4. 保存并应用迁移 (npx prisma migrate dev)

    请注意,这些更改可能会导致停机(重命名字段或模型),为此他们概述了 expand and contract pattern

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2022-11-02
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多