PostgreSQL
PostgreSQLデータソースコネクタは、Prisma ORMをPostgreSQLデータベースサーバーに接続します。
デフォルトでは、PostgreSQLコネクタにはデータベースに接続するためのデータベースドライバが含まれています。Prisma ClientからJavaScriptデータベースドライバを使用してデータベースに接続するには、ドライバアダプター(プレビュー)を使用できます。
すぐにPostgresインスタンスが必要ですか?
Prisma Postgresを使用すると、ベアメタル環境で3クリックでデータベースを起動できます。コネクションプーリング、クエリキャッシング、自動バックアップがすべて含まれています。今すぐ始めるには。
Prisma Postgresをさらに高速に始める方法をお探しですか?ターミナルで npx prisma init --db
を実行するだけです。🚀
例
PostgreSQLデータベースサーバーに接続するには、Prismaスキーマでdatasource
ブロックを設定する必要があります。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
datasource
ブロックに渡されるフィールドは次のとおりです。
provider
:postgresql
データソースコネクタを指定します。url
: PostgreSQLデータベースサーバーの接続URLを指定します。この場合、接続URLを提供するために環境変数が使用されます。
node-postgres
ドライバの使用
v5.4.0
以降、Prisma ORMの組み込みドライバを使用する代わりに、JavaScriptエコシステムからのデータベースドライバをPrisma ORMで使用できます。ドライバアダプターを使用することでこれを行うことができます。
PostgreSQLの場合、node-postgres
(pg
)はJavaScriptエコシステムで最も人気のあるドライバの1つです。これは、TCP経由でアクセスされる任意のPostgreSQLデータベースで使用できます。
このセクションでは、Prisma ORMと@prisma/adapter-pg
ドライバアダプターでこれを使用する方法について説明します。
1. driverAdapters
プレビュー機能フラグを有効にする
ドライバアダプターは現在プレビュー段階であるため、Prismaスキーマのdatasource
ブロックでその機能フラグを有効にする必要があります。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
スキーマに機能フラグを追加したら、Prisma Clientを再生成します。
npx prisma generate
2. 依存関係をインストールする
次に、pg
用のPrisma ORMのドライバアダプターをインストールします。
npm install @prisma/adapter-pg
3. ドライバアダプターを使用してPrisma Clientをインスタンス化する
最後に、Prisma Clientをインスタンス化する際には、Prisma ORMのドライバアダプターのインスタンスをPrismaClient
コンストラクタに渡す必要があります。
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '@prisma/client'
const connectionString = `${process.env.DATABASE_URL}`
const adapter = new PrismaPg({ connectionString });
const prisma = new PrismaClient({ adapter });
このコードでは、DATABASE_URL
環境変数がPostgreSQL接続文字列に設定されている必要があることに注意してください。接続文字列の詳細については、以下を参照してください。
注意事項
PostgreSQLスキーマの指定
PrismaPg
をインスタンス化する際にschema
オプションを渡すことで、PostgreSQLスキーマを指定できます。
const adapter = new PrismaPg(
{ connectionString },
{ schema: 'myPostgresSchema' }
)
接続の詳細
接続URL
Prisma ORMはPostgreSQLの公式ガイドラインで指定されている接続URL形式に従いますが、すべての引数をサポートしているわけではなく、schema
などの追加引数を含んでいます。PostgreSQL接続URLに必要なコンポーネントの概要を以下に示します。
ベースURLとパス
大文字のプレースホルダー値を使用したベースURLとパスの構造の例を以下に示します。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE
以下のコンポーネントがデータベースのベースURLを構成します。これらは常に必要です。
名前 | プレースホルダー | 説明 |
---|---|---|
ホスト | HOST | データベースサーバーのIPアドレス/ドメイン (例: localhost ) |
ポート | PORT | データベースサーバーが稼働しているポート (例: 5432 ) |
ユーザー | USER | データベースユーザー名 (例: janedoe ) |
パスワード | PASSWORD | データベースユーザーのパスワード |
データベース | DATABASE | 使用したいデータベースの名前 (例: mydb ) |
特殊文字はパーセントエンコードする必要があります。
引数
接続URLは引数も取ることができます。上記と同じ例で、3つの引数に大文字のプレースホルダー値を使用したものをここに示します。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?KEY1=VALUE&KEY2=VALUE&KEY3=VALUE
以下の引数が使用できます。
引数名 | 必須 | デフォルト | 説明 |
---|---|---|---|
schema | はい | public | 使用したいスキーマの名前 (例: myschema ) |
connection_limit | いいえ | num_cpus * 2 + 1 | コネクションプールの最大サイズ |
connect_timeout | いいえ | 5 | 新しい接続が開かれるのを待つ最大秒数。0 はタイムアウトなしを意味します。 |
pool_timeout | いいえ | 10 | プールから新しい接続を待つ最大秒数。0 はタイムアウトなしを意味します。 |
sslmode | いいえ | prefer | TLSを使用するかどうかを設定します。指定可能な値: prefer , disable , require |
sslcert | いいえ | サーバー証明書のパス。証明書パスは./prisma フォルダーを基準に解決されます | |
sslrootcert | いいえ | ルート証明書のパス。証明書パスは./prisma フォルダーを基準に解決されます | |
sslidentity | いいえ | PKCS12証明書へのパス | |
sslpassword | いいえ | PKCS12ファイルを保護するために使用されたパスワード | |
sslaccept | いいえ | accept_invalid_certs | 証明書内の欠落値を確認するかどうかを設定します。指定可能な値: accept_invalid_certs , strict |
host | いいえ | 接続に使用するソケットを含むディレクトリを指します。 | |
socket_timeout | いいえ | 単一のクエリが終了するまで待機する最大秒数 | |
pgbouncer | いいえ | false | エンジンをPgBouncer互換モードを有効にするように設定します。 |
statement_cache_size | いいえ | 100 | 2.1.0以降: 接続ごとにキャッシュされるプリペアドステートメントの数を指定します。 |
application_name | いいえ | 3.3.0以降: application_name設定パラメータの値を指定します。 | |
channel_binding | いいえ | prefer | 4.8.0以降: channel_binding設定パラメータの値を指定します。 |
options | いいえ | 3.8.0以降: 接続開始時にサーバーに送信するコマンドラインオプションを指定します。 |
例として、myschema
というスキーマに接続し、コネクションプールサイズを5
に設定し、クエリのタイムアウトを3
秒に設定したい場合、以下の引数を使用できます。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=myschema&connection_limit=5&socket_timeout=3
SSL接続の設定
データベースサーバーがSSLを使用している場合、接続URLにさまざまなパラメータを追加できます。利用可能なパラメータの概要を以下に示します。
sslmode=(disable|prefer|require)
:prefer
(デフォルト): 可能な場合、TLSを優先し、プレーンテキスト接続を受け入れます。disable
: TLSを使用しません。require
: TLSを必須とします。不可能な場合は失敗します。
sslcert=<PATH>
: サーバー証明書へのパス。これは、クライアント証明書に署名するためにデータベースサーバーが使用するルート証明書です。証明書がシステムの信頼された証明書ストアに存在しない場合、これを提供する必要があります。Google Cloudの場合、これはおそらくserver-ca.pem
です。証明書パスは./prisma
フォルダーを基準に解決されますsslidentity=<PATH>
: クライアント証明書と鍵から作成されたPKCS12証明書データベースへのパス。これは、クライアント鍵とクライアント証明書を使用して生成するPKCS12形式のSSL識別ファイルです。これら2つのファイルを1つのファイルに結合し、パスワードで保護します(次のパラメータを参照)。このファイルは、以下のコマンド(openssl
を使用)を使用してクライアント鍵とクライアント証明書で作成できます。openssl pkcs12 -export -out client-identity.p12 -inkey client-key.pem -in client-cert.pem
sslpassword=<PASSWORD>
: PKCS12ファイルを保護するために使用されたパスワード。前のステップでリストされているopenssl
コマンドは、PKCS12ファイルの作成時にパスワードを尋ねます。ここで、その同じ正確なパスワードを提供する必要があります。sslaccept=(strict|accept_invalid_certs)
:strict
: 証明書に欠落している値があるとエラーになります。Google Cloudの場合、特にデータベースにドメイン名がない場合、証明書にドメイン/IPアドレスが欠落している可能性があり、接続時にエラーが発生します。accept_invalid_certs
(デフォルト): このチェックをバイパスします。この設定によるセキュリティ上の影響に注意してください。
データベース接続URLは次のようになります。
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpassword=mypassword&sslcert=rootca.cert
ソケット経由での接続
PostgreSQLデータベースにソケット経由で接続するには、接続URLにhost
フィールドをクエリパラメータとして追加する必要があります(URIのhost
部分として設定する代わりに)。このパラメータの値は、ソケットを含むディレクトリを指す必要があります。例: postgresql://USER:PASSWORD@localhost/database?host=/var/run/postgresql/
localhost
は必須ですが、その値自体は無視され、何でも構いません。
注: このGitHubイシューで追加のコンテキストを見つけることができます。
PostgreSQLとPrismaスキーマ間の型マッピング
これら2つのテーブルは、PostgreSQLとPrismaスキーマ間の型マッピングを示しています。まずPrisma ORMのスカラー型がPostgreSQLのデータベースカラム型にどのように変換されるか、次にPostgreSQLのデータベースカラム型がPrisma ORMのスカラー型およびネイティブ型にどのように関連するかを示します。
または、Prisma型で整理された型マッピングについては、Prismaスキーマのリファレンスを参照してください。
Prisma ORMのスカラー型とPostgreSQLのデータベースカラム型間のマッピング
PostgreSQLコネクタは、Prisma ORMデータモデルのスカラー型をデータベースカラム型に次のようにマッピングします。
Prisma ORM | PostgreSQL |
---|---|
String | text |
Boolean | boolean |
Int | integer |
BigInt | bigint |
Float | double precision |
Decimal | decimal(65,30) |
DateTime | timestamp(3) |
Json | jsonb |
Bytes | bytea |
PostgreSQLのデータベースカラム型からPrisma ORMのスカラー型およびネイティブ型へのマッピング
- PostgreSQLデータベースをイントロスペクトする際、データベースの型は以下のテーブルに従ってPrisma ORMの型にマッピングされます。
- マイグレーションを作成したり、スキーマをプロトタイプ化したりする際も、このテーブルは反対方向に使用されます。
PostgreSQL (型 | エイリアス) | サポート | Prisma ORM | ネイティブデータベース型属性 | 注意事項 |
---|---|---|---|---|
bigint | int8 | ✔️ | BigInt | @db.BigInt * | *BigInt のデフォルトマッピング - スキーマに型属性は追加されません。 |
boolean | bool | ✔️ | Bool | @db.Boolean * | *Bool のデフォルトマッピング - スキーマに型属性は追加されません。 |
timestamp with time zone | timestamptz | ✔️ | DateTime | @db.Timestamptz(x) | |
time without time zone | time | ✔️ | DateTime | @db.Time(x) | |
time with time zone | timetz | ✔️ | DateTime | @db.Timetz(x) | |
numeric(p,s) | decimal(p,s) | ✔️ | Decimal | @db.Decimal(x, y) | |
real | float , float4 | ✔️ | Float | @db.Real | |
double precision | float8 | ✔️ | Float | @db.DoublePrecision * | *Float のデフォルトマッピング - スキーマに型属性は追加されません。 |
smallint | int2 | ✔️ | Int | @db.SmallInt | |
integer | int , int4 | ✔️ | Int | @db.Int * | *Int のデフォルトマッピング - スキーマに型属性は追加されません。 |
smallserial | serial2 | ✔️ | Int | @db.SmallInt @default(autoincrement()) | |
serial | serial4 | ✔️ | Int | @db.Int @default(autoincrement()) | |
bigserial | serial8 | ✔️ | Int | @db.BigInt @default(autoincrement()) | |
character(n) | char(n) | ✔️ | String | @db.Char(x) | |
character varying(n) | varchar(n) | ✔️ | String | @db.VarChar(x) | |
money | ✔️ | Decimal | @db.Money | |
text | ✔️ | String | @db.Text * | *String のデフォルトマッピング - スキーマに型属性は追加されません。 |
timestamp | ✔️ | DateTime | @db.TimeStamp * | *DateTime のデフォルトマッピング - スキーマに型属性は追加されません。 |
date | ✔️ | DateTime | @db.Date | |
enum | ✔️ | Enum | N/A | |
inet | ✔️ | String | @db.Inet | |
bit(n) | ✔️ | String | @Bit(x) | |
bit varying(n) | ✔️ | String | @VarBit | |
oid | ✔️ | Int | @db.Oid | |
uuid | ✔️ | String | @db.Uuid | |
json | ✔️ | Json | @db.Json | |
jsonb | ✔️ | Json | @db.JsonB * | *Json のデフォルトマッピング - スキーマに型属性は追加されません。 |
bytea | ✔️ | Bytes | @db.ByteA * | *Bytes のデフォルトマッピング - スキーマに型属性は追加されません。 |
xml | ✔️ | String | @db.Xml | |
配列型 | ✔️ | [] | ||
citext | ✔️* | String | @db.Citext | * Citext拡張機能が有効な場合のみ利用可能です。 |
interval | 未対応 | 未サポート | ||
cidr | 未対応 | 未サポート | ||
macaddr | 未対応 | 未サポート | ||
tsvector | 未対応 | 未サポート | ||
tsquery | 未対応 | 未サポート | ||
int4range | 未対応 | 未サポート | ||
int8range | 未対応 | 未サポート | ||
numrange | 未対応 | 未サポート | ||
tsrange | 未対応 | 未サポート | ||
tstzrange | 未対応 | 未サポート | ||
daterange | 未対応 | 未サポート | ||
point | 未対応 | 未サポート | ||
line | 未対応 | 未サポート | ||
lseg | 未対応 | 未サポート | ||
box | 未対応 | 未サポート | ||
path | 未対応 | 未サポート | ||
polygon | 未対応 | 未サポート | ||
circle | 未対応 | 未サポート | ||
複合型 | 未対応 | n/a | ||
ドメイン型 | 未対応 | n/a |
イントロスペクションは、まだサポートされていないネイティブデータベース型をUnsupported
フィールドとして追加します。
model Device {
id Int @id @default(autoincrement())
name String
data Unsupported("circle")
}
プリペアドステートメントのキャッシング
プリペアドステートメントは、パフォーマンスを最適化するために使用できる機能です。プリペアドステートメントは、一度だけ解析、コンパイル、最適化され、その後、クエリの再解析のオーバーヘッドなしで複数回直接実行できます。
プリペアドステートメントをキャッシュすることで、Prisma Clientのクエリエンジンは同じクエリを繰り返しコンパイルする必要がなくなり、データベースのCPU使用率とクエリのレイテンシが削減されます。
例えば、Prisma Clientが作成した2つの異なるクエリに対して生成されたSQLを以下に示します。
SELECT * FROM user WHERE name = "John";
SELECT * FROM user WHERE name = "Brenda";
パラメータ化後の2つのクエリは同じになり、2番目のクエリは準備ステップをスキップできるため、データベースのCPUとデータベースへの追加の往復が削減されます。パラメータ化後のクエリ
SELECT * FROM user WHERE name = $1
Prisma Clientによって維持されるすべてのデータベース接続には、プリペアドステートメントを格納するための個別のキャッシュがあります。このキャッシュのサイズは、接続文字列のstatement_cache_size
パラメータで調整できます。デフォルトでは、Prisma Clientは接続ごとに100
個のステートメントをキャッシュします。
pgBouncerの性質上、pgbouncer
パラメータがtrue
に設定されている場合、その接続のプリペアドステートメントキャッシュは自動的に無効になります。