Prisma ORM 3へのアップグレード
Prisma ORM 3は、以前のバージョン (2.xバージョン) からアップグレードする場合、多くの破壊的変更を導入しています。そのため、このアップグレードがアプリケーションにどのように影響するかを理解し、スムーズな移行を確実にするために必要な調整を行うことが重要です。
以下に、破壊的変更のリストと、それらの対処法を示します。
破壊的変更
参照アクション
バージョン3.xで参照アクションが導入されたことにより、これまでPrisma Clientでランタイムでのカスケード削除を防いでいたセーフティネットが削除されました。
結果として、アプリケーションで作業しているワークフローによっては影響を受ける可能性があります。スキーマを確認し、参照アクションを明示的に定義する必要があるかどうかを判断することをお勧めします。
進め方を理解するには、参照アクションのアップグレードパスをご覧ください。
名前付き制約
Prisma ORMが制約とインデックスに名前を付けるために従う規則を変更しました。また、Prismaスキーマで制約を明示的に制御する方法として、PSLにmap
属性(データベースレベル名)とname
属性(Prisma Client API名)の明確な区別を導入しました。
これは、Prisma migrate
またはdb pull
を実行する際に、この新しい規則に従うため、影響があることに気づくでしょう。スキーマを調整して、制約とインデックスの名前を適切に反映させることをお勧めします。
詳しい進め方については、名前付き制約のアップグレードパスをご覧ください。
$queryRaw
バージョン3.x以降、$queryRaw
メソッドはテンプレートリテラルのみをサポートするようになりました。
これは、アプリケーションが文字列を使用する$queryRaw
呼び出しに依存していた場合、それらの呼び出しは**もはや機能しません**。セキュリティ上の理由から、可能な限りテンプレートリテラルを使用するか、またはSQLインジェクションを防ぐためにクエリを慎重にエスケープした上で、$queryRawUnsafe
に頼ることをお勧めします。
新しい$queryRaw
および$queryRawUnsafe
メソッドについては、ドキュメントのRawデータベースアクセスセクションで詳しく学ぶことができます。
Json Null Equality
Json
フィールドをnull値でフィルタリングすることはできません。このGitHub Issueを参照してください。これは、{ equals: null }
がデータベースのカラム値がNULL
であるかどうかをチェックし、カラム内のJSON値がnull
であるかどうかをチェックしないためです。
この問題を解決するため、JsonフィールドのnullをJsonNull
、DbNull
、AnyNull
に分割することにしました。
- JsonNull: JSON内のnull値を選択します。
- DbNull: データベース内のNULL値を選択します。
- AnyNull: JSON null値とデータベースNULL値の両方を選択します。
Prisma Schemaに以下のモデルがあるとします。
model Log {
id Int @id
meta Json
}
3.0.1以降、Json
フィールドでnullをフィルタリングしようとするとTypeErrorが表示されます。
prisma.log.findMany({
where: {
data: {
meta: {
equals: null
^ TypeError: Type 'null' is not assignable to type
}
},
},
});
これを修正するには、新しいnull型の一つをインポートして使用します。
import { Prisma } from '@prisma/client'
prisma.log.findMany({
where: {
data: {
meta: {
equals: Prisma.AnyNull,
},
},
},
})
これは、create
、update
、およびupsert
にも適用されます。Json
フィールドにnull
値を挿入するには、次のように記述します。
import { Prisma } from '@prisma/client'
prisma.log.create({
data: {
meta: Prisma.JsonNull,
},
})
そして、JsonフィールドにデータベースNULL
を挿入するには、次のように記述します。
import { Prisma } from '@prisma/client'
prisma.log.create({
data: {
meta: Prisma.DbNull,
},
})
このAPIの変更は、JSON nullとデータベースNULLの間に違いがないMongoDBコネクタには適用されません。
また、array_contains
演算子にも適用されません。これは、JSON配列内にはJSON nullしか存在しないためです。JSON配列内にデータベースNULLは存在できないため、{ array_contains: null }
は曖昧ではありません。
特定のアップグレードパス
名前付き制約のアップグレードパス
Prisma ORM 3にアップグレードした後、制約名とインデックス名のデフォルトの命名規則が変更され、サポートされているデータベースでは、プライマリキーと外部キーの名前がスキーマの一部になります。したがって、既存のPrismaスキーマの意味が変わります。
参照アクションのアップグレードパス
Prisma ORMバージョン2.xでは、一部のPrisma Client関数で関連レコードの削除が防止され、その動作を変更するためにPrisma Schemaで参照アクションを設定できません。
prisma
および@prisma/client
パッケージをPrisma ORM 3にアップグレードする
バージョン2.xから3.xにアップグレードするには、prisma
と@prisma/client
の両方のパッケージを更新する必要があります。prisma
と@prisma/client
の両方のパッケージは、破壊的変更から保護するためにバージョン番号にキャレット^
を付けてインストールされます。
キャレット^
を無視してメジャーバージョンをまたいでアップグレードするには、npm
またはyarn
でアップグレードするときに@3
タグを使用できます。
アップグレードする前に、各破壊的変更を確認し、アップグレードがアプリケーションにどのように影響するかを確認してください。
- npm
- yarn
npm install prisma@3 @prisma/client@3
yarn up prisma@3 @prisma/client@3