CockroachDB
このガイドでは、Prisma ORMとCockroachDBを使用する際の概念について説明し、CockroachDBと他のデータベースプロバイダとの共通点および相違点を解説し、アプリケーションをCockroachDBと統合するための設定プロセスをご案内します。
CockroachDBとは?
CockroachDBは、スケーラビリティと高可用性を実現するように設計された分散データベースです。主な機能は以下の通りです。
- PostgreSQLとの互換性: CockroachDBはPostgreSQLと互換性があり、既存製品の幅広いエコシステムとの相互運用性を可能にします。
- 組み込みスケーリング: CockroachDBには、自動レプリケーション、フェイルオーバー、修復機能が備わっており、アプリケーションの水平スケーリングを容易にします。
他のデータベースプロバイダとの共通点
CockroachDBはPostgreSQLと大まかに互換性があり、Prisma ORMでもほとんど同じように使用できます。引き続き以下のことが可能です。
- Prisma Schema Languageでデータベースをモデル化する
- Prisma ORMの
cockroachdb
データベースコネクタを使用してデータベースに接続する - 既存のCockroachDBデータベースがある場合は、既存プロジェクトにイントロスペクションを使用する
- Prisma Migrateを使用してデータベーススキーマを新しいバージョンに移行する
- アプリケーションでPrisma Clientを使用して、Prismaスキーマに基づいてタイプセーフな方法でデータベースをクエリする
考慮すべき相違点
Prisma ORMのcockroachdb
コネクタを使用する際には、CockroachDB固有のいくつかの相違点に注意する必要があります。
-
CockroachDB固有のネイティブ型: Prisma ORMの
cockroachdb
データベースコネクタは、CockroachDBのネイティブデータ型をサポートしています。詳細については、CockroachDBのネイティブ型を使用する方法を参照してください。 -
データベースキーの作成: Prisma ORMでは、
autoincrement()
関数を使用して、各レコードの一意の識別子を生成できます。詳細については、CockroachDBでデータベースキーを使用する方法を参照してください。
CockroachDBでPrisma ORMを使用する方法
このセクションでは、CockroachDB固有の機能の使用方法について詳しく説明します。
CockroachDBのネイティブ型を使用する方法
CockroachDBには、Prisma ORMでサポートされている独自のネイティブデータ型があります。例えば、CockroachDBはPostgreSQLのVARCHAR
ではなくSTRING
データ型を使用します。
このデモンストレーションとして、次のSQLコマンドを使用してCockroachDBデータベースにUser
テーブルを作成するとします。
CREATE TABLE public."Post" (
"id" INT8 NOT NULL,
"title" VARCHAR(200) NOT NULL,
CONSTRAINT "Post_pkey" PRIMARY KEY ("id" ASC),
FAMILY "primary" ("id", "title")
);
npx prisma db pull
でデータベースをイントロスペクションすると、Prismaスキーマに新しいPost
モデルが作成されます。
model Post {
id BigInt @id
title String @db.String(200)
}
title
フィールドに@db.String(200)
がアノテーションされていることに注目してください。これは、アノテーションが@db.VarChar(200)
となるPostgreSQLとは異なります。
型マッピングの完全なリストについては、コネクタドキュメントを参照してください。
CockroachDBでデータベースキーを使用する方法
CockroachDBのような分散データベースでレコードの一意の識別子を生成する場合、シーケンシャルIDの使用は避けるのが最善です。詳細については、CockroachDBのインデックスキーの選択に関するブログ記事を参照してください。
代わりに、Prisma ORMは、一意の識別子を生成するためにCockroachDBのunique_rowid()
関数を使用するautoincrement()
属性関数を提供します。例えば、以下のUser
モデルには、autoincrement()
関数を使用して生成されたid
プライマリキーがあります。
model User {
id BigInt @id @default(autoincrement())
name String
}
既存のデータベースとの互換性のため、固定された整数キー値のシーケンスを生成する必要がある場合があります。このような場合、CockroachDB向けにPrisma ORMに組み込まれているsequence()
関数を使用できます。sequence()
関数で利用可能なオプションのリストについては、リファレンスドキュメントを参照してください。
データベースキーの生成に関する詳細については、CockroachDBのプライマリキーのベストプラクティスガイドを参照してください。
例
CockroachDBデータベースサーバーに接続するには、Prismaスキーマにdatasource
ブロックを設定する必要があります。
datasource db {
provider = "cockroachdb"
url = env("DATABASE_URL")
}
datasource
ブロックに渡されるフィールドは次のとおりです。
provider
:cockroachdb
データソースコネクタを指定します。url
: CockroachDBデータベースサーバーの接続URLを指定します。この場合、接続URLを提供するために環境変数が使用されます。
cockroachdb
コネクタとpostgresql
コネクタは似ていますが、バージョン5.0.0以降のCockroachDBデータベースに接続する場合は、postgresql
の代わりにcockroachdb
コネクタを使用することが必須です。
接続詳細
CockroachDBは、その接続URLにPostgreSQL形式を使用します。この形式の詳細と、それが取るオプションの引数については、PostgreSQLコネクタドキュメントを参照してください。
CockroachDBとPostgreSQLの相違点
以下の表は、CockroachDBとPostgreSQLの相違点を示しています。
問題 | 領域 | 備考 |
---|---|---|
デフォルトでは、CockroachDBではINT 型はINT8 のエイリアスですが、PostgreSQLではINT4 のエイリアスです。これは、Prisma ORMがCockroachDBのINT 列をBigInt としてイントロスペクションするのに対し、PostgreSQLではInt としてイントロスペクションすることを意味します。 | スキーマ | INT 型の詳細については、CockroachDBドキュメントを参照してください。 |
フィールドに@default(autoincrement()) を使用すると、CockroachDBは行IDに64ビット整数を自動的に生成します。これらの整数は増加しますが、連続的ではありません。これは、生成される行IDが連続的で1から始まるPostgreSQLとは対照的です。 | スキーマ | 生成される値の詳細については、CockroachDBドキュメントを参照してください。 |
@default(autoincrement()) 属性は、BigInt フィールド型と一緒にのみ使用できます。 | スキーマ | 生成される値の詳細については、CockroachDBドキュメントを参照してください。 |
CockroachDBにおける型マッピングの制限
CockroachDBコネクタは、Prisma ORMのデータモデルからスカラー型をネイティブカラム型に以下のようにマッピングします。これらのネイティブ型はPostgreSQLの場合とほとんど同じです。詳細については、Prisma ORMからCockroachDBへのネイティブ型マッピングを参照してください。ただし、いくつかの制限があります。
CockroachDB (型 | エイリアス) | Prisma ORM | サポート | ネイティブデータベース型属性 | 備考 |
---|---|---|---|---|
money | Decimal | 未対応 | @db.Money | PostgreSQLではサポートされていますが、現在CockroachDBではサポートされていません |
xml | String | 未対応 | @db.Xml | PostgreSQLではサポートされていますが、現在CockroachDBではサポートされていません |
jsonb 配列 | Json[] | 未対応 | N/A | PostgreSQLではJson[] がサポートされていますが、現在CockroachDBではサポートされていません |
その他の制限事項
以下の表は、CockroachDBとPostgreSQLを比較した場合の、その他の現在既知の制限事項をリストしています。
問題 | 領域 | 備考 |
---|---|---|
インデックス型Hash 、Gist 、SpGist 、Brin はサポートされていません。 | スキーマ | PostgreSQLでは、Prisma ORMは異なるインデックスアクセス方法を使用するためにインデックスの設定を許可しています。CockroachDBは現在、BTree とGin のみをサポートしています。 |
Enum 型へのプッシュはサポートされていません | クライアント | Enum 型へのプッシュ(例: data: { enum { push: "A" }, } )は、現在CockroachDBではサポートされていません |
フルテキストインデックスなしでのString フィールドの検索はサポートされていません | クライアント | フルテキストインデックスなしでのString フィールドの検索(例: where: { text: { search: "cat & dog", }, }, )は、現在CockroachDBではサポートされていません |
整数除算はサポートされていません | クライアント | 整数除算(例: data: { int: { divide: 10, }, } )は、現在CockroachDBではサポートされていません |
Json フィールドのフィルタリングに制限があります | クライアント | 現在、CockroachDBはJson フィールドに対するequals およびnot フィルタリングのみをサポートしています |
CockroachDBとPrismaスキーマ間の型マッピング
CockroachDBコネクタは、Prisma ORMのデータモデルからスカラー型をネイティブカラム型に以下のようにマッピングします。
または、Prisma ORM型別に整理された型マッピングについては、Prismaスキーマのリファレンスを参照してください。
Prisma ORMからCockroachDBへのネイティブ型マッピング
Prisma ORM | CockroachDB |
---|---|
String | STRING |
Boolean | BOOL |
Int | INT4 |
BigInt | INT8 |
Float | FLOAT8 |
Decimal | DECIMAL(65,30) |
DateTime | TIMESTAMP(3) |
Json | JSONB |
Bytes | BYTES |
イントロスペクション時のCockroachDBからPrisma ORM型へのマッピング
CockroachDBデータベースをイントロスペクションする際、データベース型は以下の表に従ってPrisma ORMにマッピングされます。
CockroachDB (型 | エイリアス) | Prisma ORM | サポート | ネイティブデータベース型属性 | 備考 |
---|---|---|---|---|
INT | BIGINT , INTEGER | BigInt | ✔️ | @db.Int8 | |
BOOL | BOOLEAN | Bool | ✔️ | @db.Bool * | |
TIMESTAMP | TIMESTAMP WITHOUT TIME ZONE | DateTime | ✔️ | @db.Timestamp(x) | |
TIMESTAMPTZ | TIMESTAMP WITH TIME ZONE | DateTime | ✔️ | @db.Timestamptz(x) | |
TIME | TIME WITHOUT TIME ZONE | DateTime | ✔️ | @db.Time(x) | |
TIMETZ | TIME WITH TIME ZONE | DateTime | ✔️ | @db.Timetz(x) | |
DECIMAL(p,s) | NUMERIC(p,s) , DEC(p,s) | Decimal | ✔️ | @db.Decimal(x, y) | |
REAL | FLOAT4 , FLOAT | Float | ✔️ | @db.Float4 | |
DOUBLE PRECISION | FLOAT8 | Float | ✔️ | @db.Float8 | |
INT2 | SMALLINT | Int | ✔️ | @db.Int2 | |
INT4 | Int | ✔️ | @db.Int4 | |
CHAR(n) | CHARACTER(n) | String | ✔️ | @db.Char(x) | |
"char" | String | ✔️ | @db.CatalogSingleChar | CockroachDBカタログテーブルの内部型であり、エンドユーザー向けではありません。 |
STRING | TEXT , VARCHAR | String | ✔️ | @db.String | |
DATE | DateTime | ✔️ | @db.Date | |
ENUM | enum | ✔️ | N/A | |
INET | String | ✔️ | @db.Inet | |
BIT(n) | String | ✔️ | @Bit(x) | |
VARBIT(n) | BIT VARYING(n) | String | ✔️ | @VarBit | |
OID | Int | ✔️ | @db.Oid | |
UUID | String | ✔️ | @db.Uuid | |
JSONB | JSON | Json | ✔️ | @db.JsonB | |
配列型 | [] | ✔️ |
イントロスペクションは、Unsupported
フィールドとしてまだサポートされていないネイティブデータベース型を追加します。
model Device {
id BigInt @id @default(autoincrement())
interval Unsupported("INTERVAL")
}
Prisma ORMとCockroachDBのさらに詳しい使用方法
CockroachDBをPrisma ORMですぐに使い始めるには、入門ドキュメントを参照してください。
これらのチュートリアルでは、CockroachDBへの接続、スキーマの移行、Prisma Clientの使用について説明します。
さらなる参考情報は、CockroachDBコネクタドキュメントで入手できます。