如何在Nest.js后端动态更新Prisma类型且不删除Postgres数据?
解决方案:更新Prisma类型且保留数据库数据
首先纠正一个关键误解:prisma generate本身不会删除数据库数据——它只是根据你的schema.prisma文件生成Prisma Client的类型定义和客户端代码,完全不涉及数据库的读写或结构重置。你遇到的数据丢失,大概率是误执行了prisma migrate reset这类会重置数据库的命令,或者错误使用了prisma db push的强制重置参数。
下面是针对你场景的正确操作流程:
一、常规增量变更流程(推荐,适合需要追踪结构变更的场景)
当你需要给表添加新列时,按以下步骤操作:
- 修改
schema.prisma文件,添加新列的定义(比如给users表加phone字段) - 生成增量迁移文件并同步到数据库:
这个命令会生成一个包含新增列SQL的迁移文件,同时将变更同步到数据库,完全保留现有数据prisma migrate dev --name add_phone_column_to_users - 更新Prisma类型:
这一步会生成包含新列类型的prisma generatePrisma.usersCreateInput等类型,不影响数据库任何数据
二、快速迭代场景(适合开发初期频繁调整schema)
如果不想维护迁移文件,想用更快捷的方式同步schema变更:
- 修改
schema.prisma文件 - 直接同步schema到数据库:
注意:不要加prisma db push--force-reset参数,默认情况下db push只会增量变更结构,不会删除现有数据 - 执行
prisma generate更新类型即可
三、关于直接使用Prisma类型作为DTO的建议
你现在直接用Prisma.usersCreateInput作为接口参数类型,虽然快捷,但schema频繁变更时会导致API的请求参数自动变化(比如新列会被自动加入到CreateInput中),可能引发前端或调用方的兼容性问题。建议自定义独立的CreateUserDto,在服务层将DTO映射到Prisma的类型,这样API契约更稳定,不受schema变更的直接影响。
内容的提问来源于stack exchange,提问作者Saad Zubairi
相关产品推荐
相关产品推荐

