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

PostgreSQL

PostgreSQLデータソースコネクタは、Prisma ORMをPostgreSQLデータベースサーバーに接続します。

デフォルトでは、PostgreSQLコネクタにはデータベースに接続するためのデータベースドライバが含まれています。Prisma ClientからJavaScriptデータベースドライバを使用してデータベースに接続するには、ドライバアダプター(プレビュー)を使用できます。

情報

すぐにPostgresインスタンスが必要ですか?

Prisma Postgresを使用すると、ベアメタル環境で3クリックでデータベースを起動できます。コネクションプーリング、クエリキャッシング、自動バックアップがすべて含まれています。今すぐ始めるには。

Prisma Postgresをさらに高速に始める方法をお探しですか?ターミナルで npx prisma init --db を実行するだけです。🚀

PostgreSQLデータベースサーバーに接続するには、Prismaスキーマdatasourceブロックを設定する必要があります。

schema.prisma
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-postgrespg)は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 @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に必要なコンポーネントの概要を以下に示します。

Structure of the PostgreSQL connection 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いいえpreferTLSを使用するかどうかを設定します。指定可能な値: 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いいえ1002.1.0以降: 接続ごとにキャッシュされるプリペアドステートメントの数を指定します。
application_nameいいえ3.3.0以降: application_name設定パラメータの値を指定します。
channel_bindingいいえprefer4.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 ORMPostgreSQL
Stringtext
Booleanboolean
Intinteger
BigIntbigint
Floatdouble precision
Decimaldecimal(65,30)
DateTimetimestamp(3)
Jsonjsonb
Bytesbytea

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✔️EnumN/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フィールドとして追加します。

schema.prisma
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に設定されている場合、その接続のプリペアドステートメントキャッシュは自動的に無効になります。

© . All rights reserved.