PostgreSQL
PostgreSQLデータソースコネクタは、Prisma ORMをPostgreSQLデータベースサーバーに接続します。
デフォルトでは、PostgreSQLコネクタにはデータベースへの接続を担当するデータベースドライバが含まれています。ドライバアダプタ(プレビュー)を使用すると、Prisma ClientからJavaScriptデータベースドライバを使用してデータベースに接続できます。
すぐにPostgresインスタンスが必要ですか?
Prisma Postgresを使用すると、3クリックでベアメタル上でデータベースを実行できます。接続プーリング、クエリキャッシュ、自動バックアップがすべて含まれています。今日から始める。
Prisma Postgresをさらに速く始める方法は?ターミナルでnpx prisma init --db
を実行するだけです。🚀
例
PostgreSQLデータベースサーバーに接続するには、datasource
ブロックをPrismaスキーマで構成する必要があります。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
datasource
ブロックに渡されるフィールドは次のとおりです。
provider
:postgresql
データソースコネクタを指定します。url
: PostgreSQLデータベースサーバーの接続URLを指定します。この例では、環境変数が使用されています接続URLを提供するために。
node-postgres
ドライバの使用
v5.4.0
以降、JavaScriptエコシステムのデータベースドライバ(Prisma ORMの組み込みドライバの代わりに)でPrisma ORMを使用できます。ドライバアダプタを使用することでこれが可能です。
PostgreSQLの場合、node-postgres
(pg
) はJavaScriptエコシステムで最も人気のあるドライバの1つです。TCP経由でアクセスされるすべてのPostgreSQLデータベースで使用できます。
このセクションでは、Prisma ORMおよび@prisma/adapter-pg
ドライバアダプタでこれを使用する方法について説明します。
1. driverAdapters
プレビュー機能フラグを有効にする
ドライバアダプタは現在プレビュー段階であるため、Prismaスキーマのdatasource
ブロックで機能フラグを有効にする必要があります。
// schema.prisma
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 pg
npm install @prisma/adapter-pg
3. ドライバアダプタを使用してPrisma Clientをインスタンス化する
最後に、Prisma Clientをインスタンス化するときは、Prisma ORMのドライバアダプタのインスタンスをPrismaClient
コンストラクタに渡す必要があります。
import { Pool } from 'pg'
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '@prisma/client'
const connectionString = `${process.env.DATABASE_URL}`
const pool = new Pool({ connectionString })
const adapter = new PrismaPg(pool)
const prisma = new PrismaClient({ adapter })
このコードでは、DATABASE_URL
環境変数がPostgreSQL接続文字列に設定されている必要があることに注意してください。接続文字列の詳細については、以下をご覧ください。
注
PostgreSQLスキーマの指定
PostgreSQLスキーマは、PrismaPg
をインスタンス化するときにschema
オプションを渡すことで指定できます。
const adapter = new PrismaPg(pool, {
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 | Engineを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データベースに接続するには、host
フィールドを接続URLへのクエリパラメータとして追加する必要があります(URIのhost
部分として設定するのではなく)。このパラメータの値は、ソケットを含むディレクトリを指す必要があります。例:postgresql://USER:PASSWORD@localhost/database?host=/var/run/postgresql/
localhost
は必須であることに注意してください。値自体は無視され、何でもかまいません。
注:追加のコンテキストについては、このGitHub issueを参照してください。
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")
}
プリペアドステートメントキャッシュ
プリペアドステートメントは、パフォーマンスを最適化するために使用できる機能です。プリペアドステートメントは、解析、コンパイル、および最適化が1回だけ行われ、クエリを再度解析するオーバーヘッドなしに、複数回直接実行できます。
プリペアドステートメントをキャッシュすることにより、Prisma Clientのクエリエンジンは同じクエリを繰り返しコンパイルしないため、データベースのCPU使用率とクエリのレイテンシが削減されます。
たとえば、Prisma Clientによって作成された2つの異なるクエリに対して生成されたSQLを次に示します。
SELECT * FROM user WHERE name = "John";
SELECT * FROM user WHERE name = "Brenda";
パラメータ化後の2つのクエリは同じになり、2番目のクエリは準備ステップをスキップできるため、データベースCPUとデータベースへの追加のラウンドトリップを1回節約できます。パラメータ化後のクエリ
SELECT * FROM user WHERE name = $1
Prisma Clientによって維持されるすべてのデータベース接続には、プリペアドステートメントを保存するための個別のキャッシュがあります。このキャッシュのサイズは、接続文字列のstatement_cache_size
パラメータで調整できます。デフォルトでは、Prisma Clientは接続ごとに100
ステートメントをキャッシュします。
pgBouncerの性質上、pgbouncer
パラメータがtrue
に設定されている場合、プリペアドステートメントキャッシュはその接続に対して自動的に無効になります。