跳到主要內容

具名約束升級路徑

升級至 Prisma ORM 3 後,約束和索引名稱的預設命名慣例將會變更,而您的主鍵和外鍵名稱現在將成為支援它們的資料庫的結構描述的一部分。因此,您現有 Prisma 結構描述的意義將會改變。

在您繼續發展您的結構描述和資料庫之前,您應該決定在未來您的專案上要使用哪些約束和索引名稱。

您可以保留資料庫中已存在的名稱,也可以切換為使用 Prisma ORM 產生的名稱,這些名稱遵循新的命名慣例。

本頁描述了升級至 Prisma ORM 3 後您需要執行的手動升級步驟。您可以選擇以下兩個選項之一

選項 1:我想保留我現有的約束和索引名稱

如果您想保持資料庫不變,並保留現有的約束和索引名稱,您需要將它們拉入您的結構描述,以便 Prisma ORM 能夠識別它們。

保留您現有名稱的原因可能是

  • 您必須遵循的命名慣例
  • 其他工具依賴這些名稱
  • 個人偏好

若要保留現有名稱,請針對目標環境執行 prisma db pull。這將導致所有不符合 Prisma ORM 約束和索引名稱命名慣例的名稱,以 map 引數的形式拉入您的結構描述中,放在它們各自的屬性上。

  1. 結構描述範例

    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])
    }
  2. 內省您的開發資料庫,以在您的底層資料庫中,使用約束和索引名稱來填入 Prisma 結構描述,這些名稱不符合 Prisma ORM 的命名慣例

    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 Schema 清潔,並且您沒有任何理由阻止您重新命名資料庫中的約束和索引,那麼您可以建立一個遷移來更新名稱。

執行 prisma migrate dev 以建立遷移,將約束名稱更新為 Prisma ORM 的預設值。

之後,如果您有生產環境,別忘了對您的生產環境執行 prisma migrate deploy,以在那裡也更新名稱。以下結構描述沒有明確列出約束或索引名稱,因此 Prisma ORM 將會推斷它們。

  1. 結構描述範例

    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
    }
  2. 執行 prisma migrate dev 命令以產生新的遷移

    npx prisma migrate dev

    此遷移會重新命名任何目前不符合 Prisma ORM 命名慣例的約束。

  3. 執行 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 知道不要將此遷移套用到生產環境,因為您已經將其標記為已套用。

您的環境現在已同步,您可以繼續執行 migrate 使用者的升級路徑。這些路徑可讓您選擇未來的命名方案。