メインコンテンツへスキップ

サポートされていないデータベース機能 (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スキーマで宣言することで、拡張機能を有効にできます。

schema.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

サポートされていないフィールド型

polygongeometryのようなリレーショナルデータベースの一部のデータベース型には、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を使用している場合、サポートされていない機能をマイグレーションの一部として含める必要があります。

© . All rights reserved.