跳到主要内容

使用扩展和收缩模式迁移数据

10 分钟

简介

在生产环境中更改数据库 schema 时,确保数据一致性并避免停机至关重要。本指南将向您展示如何使用扩展和收缩模式安全地在列之间迁移数据。我们将通过一个实际示例,演示如何在保留现有数据的情况下,将布尔字段替换为枚举字段。

先决条件

在开始本指南之前,请确保您已具备以下条件

  • 已安装 Node.js (版本 18 或更高版本)
  • 具有现有 schema 的 Prisma ORM 项目
  • 受支持的数据库 (PostgreSQL、MySQL、SQLite、SQL Server 等)
  • 可以访问开发和生产数据库
  • Git 分支的基础知识
  • TypeScript 的基本熟悉度

1. 设置您的环境

1.1. 审查初始 schema

从包含 Post 模型的基本 schema 开始

generator client {
provider = "prisma-client-js"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
}

1.2. 创建开发分支

为您的更改创建一个新分支

git checkout -b create-status-field

2. 扩展 schema

2.1. 添加新列

更新您的 schema 以添加新的 Status 枚举和字段

model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean? @default(false)
status Status @default(Unknown)
}

enum Status {
Unknown
Draft
InProgress
InReview
Published
}

2.2. 创建迁移

生成迁移

npx prisma migrate dev --name add-status-column

3. 迁移数据

3.1. 创建迁移脚本

为数据迁移创建一个新的 TypeScript 文件

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

async function main() {
await prisma.$transaction(async (tx) => {
const posts = await tx.post.findMany()
for (const post of posts) {
await tx.post.update({
where: { id: post.id },
data: {
status: post.published ? 'Published' : 'Unknown',
},
})
}
})
}

main()
.catch(async (e) => {
console.error(e)
process.exit(1)
})
.finally(async () => await prisma.$disconnect())

3.2. 设置迁移脚本

将迁移脚本添加到您的 package.json

{
"scripts": {
"data-migration:add-status-column": "tsx ./prisma/migrations/<migration-timestamp>/data-migration.ts"
}
}

3.3. 执行迁移

  1. 更新您的 DATABASE_URL 以指向生产数据库
  2. 运行迁移脚本
npm run data-migration:add-status-column

4. 收缩 schema

4.1. 创建清理分支

创建一个新分支以移除旧列

git checkout -b drop-published-column

4.2. 移除旧列

更新您的 schema 以移除 published 字段

model Post {
id Int @id @default(autoincrement())
title String
content String?
status Status @default(Unknown)
}

enum Status {
Draft
InProgress
InReview
Published
}

4.3. 生成清理迁移

创建并运行最终迁移

npx prisma migrate dev --name drop-published-column

5. 部署到生产环境

5.1. 设置部署

将以下命令添加到您的 CI/CD 管道

npx prisma migrate deploy

5.2. 监控部署

部署后,观察日志中是否有任何错误,并监控应用程序的行为。

故障排除

常见问题和解决方案

  1. 迁移因缺少默认值而失败

    • 确保您已添加适当的默认值
    • 检查是否可以迁移所有现有记录
  2. 数据丢失预防

    • 在运行迁移之前,始终备份您的数据库
    • 首先在生产数据的副本上测试迁移
  3. 事务回滚

    • 如果数据迁移失败,事务将自动回滚
    • 修复任何错误并重试迁移

后续步骤

现在您已经完成了您的第一次扩展和收缩迁移,您可以

获取更多信息和更新