如何在不删除PostgreSQL数据的情况下运行Prisma模式更新?

fcg9iug3  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(288)

我有一个Nest. Js/ Prisma应用程序使用的PostgreSQL数据库。
我们更改了Prisma模式中一个字段的名称,并添加了一个新字段。
现在,当我们想要更新PostreSQL结构时,我运行as suggested by Prisma,下面的命令:

npx prisma generate

然后

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

这个想法是使用--create-only标志在实际执行迁移之前检查迁移。
但是,当我运行它时,我会得到一个要对DB进行更改的列表和以下消息:

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在DB级别上实现,但是,在该迁移文件中仍然有一些命令会删除我以前的表,因为里面有一些新参数。我如何在不删除PostgreSQL数据的情况下运行prisma迁移?
更新2:我不希望Prisma在我刚更新表时删除它们。但是,生成的迁移文件会删除它们,然后更改它们。您知道避免这种删除的最佳程序是什么吗?我在某个地方看到,我可以首先使用新选项手动更新DB,然后运行迁移,以便Prisma可以找到更新它的方法。但那对我来说太手动了...也许有其他的想法?

7jmck4yq

7jmck4yq1#

对于某些情况,如重命名表或列,Prisma生成的迁移文件需要更新,如果它们已经包含数据。
如果这适用于您的用例,Prisma的文档建议:
1.更新prisma模式,例如:

model Profile {
    id        Int    @id @default(autoincrement())
 -   biograpy  String
 +   biography String
    userId    Int    @unique
    user      User   @relation(fields: [userId], references: [id])
  }

1.创建迁移文件但不应用它:
运行npx prisma migrate dev --create-only

注意:--create-only标志避免应用

1.更新迁移脚本以删除删除,并改为编写自定义查询,例如:

-- inside migrations/your_migration.sql

RENAME biograpy TO biography

1.保存并应用迁移:npx prisma migrate dev
请注意,这些更改可能会导致停机(重命名字段或模型),为此,他们概述了扩展和收缩模式。

qyyhg6bp

qyyhg6bp2#

这可能是一个Prisma bug:https://github.com/prisma/prisma/issues/8053
我最近也遇到过这种情况。如果你只想创建迁移文件,它可能不应该尝试运行迁移。
但总体而言,Prisma有时会重新创建数据库。如果您的迁移中断,则无论如何都需要在应用时重置数据。
我建议你创建一些种子脚本,这样你就可以一致地重新创建数据库状态,这对你的开发环境非常有用。
More info

相关问题