命名約束升級路徑
升級到 Prisma ORM 3 後,約束和索引名稱的預設命名約定將發生變化,您的主鍵和外部索引鍵名稱現在將成為支援它們的資料庫模式的一部分。因此,您現有 Prisma 模式的含義也將改變。
在您繼續演進您的模式和資料庫之前,您應該決定將來在您的專案中要使用哪些約束和索引名稱。
您可以保留資料庫中已有的名稱,也可以切換使用 Prisma ORM 生成的名稱,後者遵循新的命名約定。
本頁描述了升級到 Prisma ORM 3 後您需要執行的手動升級步驟。您可以選擇以下兩種選項中的任何一個:
- 選項 1:我希望保留現有約束和索引名稱
- 選項 2:我希望使用 Prisma ORM 的預設約束和索引名稱
選項 1:我希望保留現有約束和索引名稱
如果您希望資料庫保持不變並保留現有約束和索引名稱,則需要將它們拉入您的模式中,以便 Prisma ORM 能夠識別它們。
保留現有名稱的原因可能包括:
- 您必須遵循的命名約定
- 依賴這些名稱的其他工具
- 個人偏好
要保留現有名稱,請對目標環境執行 prisma db pull。這將導致所有不符合 Prisma ORM 約束和索引命名約定的名稱被拉入您的模式,作為其各自屬性上的 map 引數。
-
示例模式
model User {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name])
} -
內省您的 開發資料庫,以使用底層資料庫中不符合 Prisma ORM 命名約定的約束和索引名稱來填充 Prisma 模式
npx prisma db pull在此示例中,突出顯示的約束不符合 Prisma ORM 的預設命名約定,現在包含
map屬性欄位model User {
id Int @id(map: "Custom_Constraint_Name") @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint")
}
選項 2:我希望使用 Prisma ORM 的預設約束和索引名稱
如果您希望保持 Prisma 模式的整潔,並且沒有理由阻止您在資料庫中重新命名約束和索引,那麼您可以建立一個遷移來更新這些名稱。
執行 prisma migrate dev 建立一個遷移,將約束名稱更新為 Prisma ORM 的預設值。
之後,如果您有生產環境,請不要忘記對生產環境執行 prisma migrate deploy 以在那裡也更新名稱。下面的模式沒有明確指定約束或索引名稱,因此 Prisma ORM 將推斷它們。
-
示例模式
model User {
name String @id //inferred as User_pkey
posts Post[]
}
model Post {
id Int @id @default(autoincrement()) //inferred as Post_pkey
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name]) //inferred as Post_authorName_fkey
} -
執行
prisma migrate dev命令以生成新的遷移npx prisma migrate dev此遷移會重新命名當前不符合 Prisma ORM 命名約定的任何約束。
-
執行
prisma migrate deploy命令以將遷移應用到您的生產環境npx prisma migrate deploy
處理同一應用程式使用多個數據庫環境的情況
檢查您的環境是否使用相同的名稱
由於 Prisma ORM 過去沒有提供明確定義約束或索引名稱的方法,您可能會遇到不同資料庫環境具有不同約束或索引名稱的情況。
為了檢測這種情況
- 建立當前
schema.prisma檔案的備份。 - 對每個資料庫環境執行
prisma db pull,使用--schema選項將結果儲存到各自的單獨檔案中。 請參閱參考
然後,您可以手動檢查這兩個檔案,或在您的 IDE 或終端中使用 diff 工具。如果您看到約束名稱存在差異,則您的生產環境和本地環境不同步,應該進行對齊。
在以下示例中,Post 模型在生產環境中有一個自定義名稱的外部索引鍵約束,該名稱與開發環境不匹配。
開發環境:
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Foreign_Key_Constraint")
}
生產環境:
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name], map: "Custom_Production_Name")
}
如果約束或索引名稱不同,請對齊您的環境
如果您的環境名稱不同,最安全的選項是將您的開發環境與生產環境中的名稱對齊。這確保了您的生產資料庫無需執行任何更改。
為了實現這一點
- 對您的生產環境執行
prisma db pull,以拉取約束和索引名稱 - 切換到開發環境,執行
prisma migrate dev建立新的遷移。您可以將該遷移命名為migration-to-sync-names - 切換到生產環境,執行
prisma migrate resolve --applied migration-to-sync-names以將該遷移標記為已應用於生產環境
您的遷移歷史現在包含一個遷移,以確保您啟動的任何新環境的名稱與您的生產資料庫的名稱相同。並且 Prisma ORM 知道不會將此遷移應用於生產環境,因為您已將其標記為已應用。
您的環境現在已同步,您可以繼續閱讀 面向遷移使用者的升級路徑。這些路徑允許您選擇未來的命名方案。