数据库迁移
- prisma提供了数据库迁移
使用场景
- 系统升级或更换:当企业需要升级现有系统或更换到新的系统时,需要将数据从旧系统迁移到新系统,以确保数据的连续性和可用性。
- 数据中心迁移企业可能需要将数据从一个数据中心迁移到另一个数据中心,以优化资源、降低成本或提高性能。
- 云迁移:将本地数据库迁移到云平台
- 数据库技术更换: 由于性能、功能或成本等原因,企业可能需要将数据从一种数据库管理系统迁移到另一种,如从 MySQL 迁移到 PostgreSQL
迁移命令
每次数据库迁移,都会有迁移历史
-
创建迁移
-
prisma migrate
-
--name init 用于为这次迁移命名,init可以随意更改
-
# 创建第一个迁移:
prisma migrate dev --name init
- 当修改了字段,可进行第二次迁移
- add_name是自己随意定义的命名,表示迁移的命名,表示添加了name字段
prisma migrate dev --name add_name
常用命令
# 创建数据库迁移
prisma migrate dev
# 确保Prisma 架构与数据库架构同步,从数据库提取结构生成schema.prisma
prisma db pull
# 将开发完成的迁移应用到生产数据库
prisma migrate deploy
# 验证迁移状态,避免直接使用dev命令导致意外重置
prisma migrate status
| 命令 | 用途 | 适用场景 |
|---|---|---|
prisma migrate dev | 生成并应用迁移,检测架构漂移,重置开发数据库 | 本地开发、测试环境 |
prisma migrate deploy | 将开发完成的迁移应用到生产数据库 | 生产环境部署 |
prisma migrate status | 查看迁移状态(已应用/未应用) | 生产环境检查、CI/CD |
prisma migrate resolve | 手动标记迁移状态(解决冲突或基线设置) | 修复迁移历史异常 |
prisma migrate diff | 生成两个状态间的SQL差异(用于自定义迁移或基线) | 复杂变更、现有数据库迁移 |
prisma db push | 直接同步Schema到数据库(不生成迁移文件) | 快速原型设计 |
prisma migrate reset | 重置数据库并重新应用所有迁移 | 开发环境清理 |
prisma db pull | 从数据库逆向生成Schema | 现有数据库接入 |
prisma migrate dev理解
- 生成迁移文件:根据
schema.prisma的变更生成对应的SQL语句,并保存在migrations目录下。 - 应用迁移:执行生成的SQL文件,将数据库结构与
schema.prisma同步。 - 生成Prisma Client:根据最新数据库模式重新生成客户端代码,提供操作API
适用场景:
- 开发环境:主要用于本地开发,例如新增字段、修改表结构等。每次模型变更后需运行此命令以保持数据库与代码一致。
- 初始化数据库:首次创建数据库时(如项目初始化),通过
npx prisma migrate dev --name init生成初始迁移文件并创建表。 - 协作与版本控制:生成的迁移文件可提交到代码仓库,供团队成员同步数据库结构。
prisma migrate deploy理解
- **生产环境部署: **将开发阶段生成的迁移文件应用到生产数据库。例如,在服务器启动时通过CI/CD流程自动执行此命令,确保生产数据库与最新代码同步
prisma migrate deploy不会影响本地SQLite文件, 需要注意DATABASE_URL数据库连接的地址- 若误将
DATABASE_URL指向本地文件并执行deploy,会修改该文件
- 若误将
生产服务器部署
# 拉取最新代码(包含迁移文件)
git pull origin main
# 安装依赖
npm install
# 应用迁移到生产数据库(确保DATABASE_URL指向生产DB)
npx prisma migrate deploy
# 生成Prisma Client(如果未预生成)
npx prisma generate
# 启动应用
npm start
生成dev.db数据库文件
SQLite是基于文件的数据库,不需要服务器,所以dev.db文件直接存储在项目目录中,路径由schema.prisma中的url指定。默认情况下,路径是相对于prisma目录的,因此dev.db应该出现在prisma文件夹的同级目录,或者根据配置的位置而定
当以下条件满足时,SQLite 会自动创建 dev.db 文件:
1、正确配置 schema.prisma 中的 SQLite 数据源
在 prisma/schema.prisma 文件中,必须明确配置 datasource 使用 sqlite,并指定 url 为 "file:./dev.db"(默认路径):
datasource db {
provider = "sqlite"
url = "file:./dev.db" // 指定项目根目录下生成 dev.db
}
2、首次执行迁移或数据库操作命令
- 当运行
prisma migrate dev、prisma db push或直接通过 Prisma Client 访问数据库时,如果dev.db文件不存在,Prisma 会自动创建该文件。 - SQLite 的特性是 “按需创建文件” ,无需手动初始化数据库文件。
注意事项
- 避免生产环境使用
dev命令:dev会重置数据库,仅限开发使用。 - 处理架构漂移:若手动修改数据库结构,需通过
prisma db pull更新Schema并生成新迁移。 - 字段变更策略: 新增必填字段需设置默认值或分步迁移(先设为可选,再逐步填充数据)。
- 不支持的特性:存储过程、触发器等需通过自定义SQL迁移实现。
- 回滚机制:通过
migrate resolve标记失败迁移,或使用向下迁移(down.sql) - 开发环境命令:migrate dev、migrate reset
- 开发命令,绝不能在生产环境中使用!