サポートされていないデータベース機能 (Prismaスキーマ)
Prisma ORMがサポートするすべてのデータベースの関数と機能が、Prismaスキーマ言語に相当するわけではありません。サポートされている機能の完全なリストについては、データベース機能マトリックスを参照してください。
ネイティブデータベース関数
Prismaスキーマ言語は、フィールドのデフォルト値を設定するために使用できるいくつかの関数をサポートしています。以下の例では、Prisma ORMレベルのuuid()
関数を使用してid
フィールドの値を設定しています。
model Post {
id String @id @default(uuid())
}
ただし、リレーショナルデータベースではdbgenerated(...)
を使用して、ネイティブデータベース関数でデフォルト値を定義することもできます(MongoDBにはデータベースレベルの関数の概念はありません)。以下の例では、PostgreSQLのgen_random_uuid()
関数を使用してid
フィールドに値を入力しています。
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
}
データベースレベル関数を使用するタイミング
データベースレベル関数を使用する理由は2つあります
-
同等のPrisma ORM関数がない場合(例:PostgreSQLの
gen_random_bytes
)。 -
uuid()
やcuid()
などの関数に依存できない、または依存したくない場合。これらの関数はPrisma ORMレベルでのみ実装されており、データベースには反映されません。以下の例を考えてみましょう。
id
フィールドをランダムに生成されたUUID
に設定します。model Post {
id String @id @default(uuid())
}UUID
は、Prisma Clientを使用してPost
を作成する場合にのみ生成されます。プレーンSQLで記述された一括インポートスクリプトなど、他の方法で投稿を作成する場合、UUID
は自分で生成する必要があります。
ネイティブデータベース関数のためのPostgreSQL拡張を有効にする
PostgreSQLでは、一部のネイティブデータベース関数は拡張機能の一部です。例えば、PostgreSQLバージョン12.13以前では、gen_random_uuid()
関数はpgcrypto
拡張機能の一部です。
PostgreSQL拡張機能を使用するには、まずデータベースサーバーのファイルシステムにインストールする必要があります。
Prisma ORMバージョン4.5.0以降では、postgresqlExtensions
プレビュー機能を使用してPrismaスキーマで宣言することで、拡張機能を有効にできます。
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
extensions = [pgcrypto]
}
以前のバージョンのPrisma ORMでは、代わりにSQLコマンドを実行して拡張機能を有効にする必要があります。
CREATE EXTENSION IF NOT EXISTS pgcrypto;
プロジェクトでPrisma Migrateを使用している場合、マイグレーションの一部として拡張機能をインストールする必要があります。シャドウデータベースにも必要であるため、拡張機能を手動でインストールしないでください。
拡張機能が利用できない場合、Prisma Migrateは以下のエラーを返します。
Migration `20210221102106_failed_migration` failed to apply cleanly to a temporary database.
Database error: Error querying the database: db error: ERROR: type "pgcrypto" does not exist
サポートされていないフィールド型
polygon
やgeometry
のようなリレーショナルデータベースの一部のデータベース型には、Prismaスキーマ言語に相当するものがありません。Prismaスキーマでフィールドを表すには、Unsupported
フィールド型を使用します。
model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}
prisma migrate dev
コマンドとprisma db push
コマンドはどちらも、データベースにcircle
型のposition
フィールドを作成します。ただし、生成されたPrisma Clientではそのフィールドは利用できません。
サポートされていないデータベース機能
SQLビューや部分インデックスなど、一部の機能はPrismaスキーマでは表現できません。プロジェクトでPrisma Migrateを使用している場合、サポートされていない機能をマイグレーションの一部として含める必要があります。