使用擴充套件-收縮模式遷移資料
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. 執行遷移
- 更新您的 DATABASE_URL 以指向生產資料庫
- 執行遷移指令碼
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. 監控部署
部署後,密切關注日誌中的任何錯誤並監控應用程式的行為。
故障排除
常見問題和解決方案
-
因缺少預設值導致遷移失敗
- 確保您已新增適當的預設值
- 檢查所有現有記錄是否可以遷移
-
資料丟失預防
- 在執行遷移之前,請務必備份您的資料庫
- 首先在生產資料的副本上測試遷移
-
事務回滾
- 如果資料遷移失敗,事務將自動回滾
- 修復任何錯誤並重試遷移
下一步
現在您已經完成了第一次擴充套件-收縮遷移,您可以:
- 瞭解更多關於Prisma Migrate的資訊
- 探索schema 原型設計
- 理解自定義遷移
獲取更多資訊
與 Prisma 保持聯絡
透過以下方式與 Prisma 保持聯絡,繼續您的 Prisma 之旅: 我們的活躍社群。保持資訊更新,參與其中,並與其他開發者協作
- 在 X 上關注我們 獲取公告、直播活動和實用技巧。
- 加入我們的 Discord 提問、與社群交流,並透過對話獲得積極支援。
- 在 YouTube 上訂閱 獲取教程、演示和直播。
- 在 GitHub 上參與 透過加星倉庫、報告問題或為問題貢獻程式碼。