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

PostgreSQL

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

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

info

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

Prisma Postgresを使用すると、3クリックでベアメタル上でデータベースを実行できます。接続プーリング、クエリキャッシュ、自動バックアップがすべて含まれています。今日から始める。

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

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

schema.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に必要なコンポーネントの概要を次に示します。

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
info

特殊文字をパーセントエンコードする必要があります。

引数

接続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を使用するかどうかを設定します。可能な値:preferdisablerequire
sslcertいいえサーバー証明書のパス。証明書パスは./prismaフォルダを基準に解決されます。
sslrootcertいいえルート証明書のパス。証明書パスは./prismaフォルダを基準に解決されます。
sslidentityいいえPKCS12証明書へのパス
sslpasswordいいえPKCS12ファイルの保護に使用されたパスワード
sslacceptいいえaccept_invalid_certs証明書に欠落値がないか確認するかどうかを設定します。可能な値:accept_invalid_certsstrict
hostいいえ接続に使用するソケットを含むディレクトリを指します。
socket_timeoutいいえ単一のクエリが終了するまで待機する最大秒数
pgbouncerいいえfalseEngineを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データベースに接続するには、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 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")
}

プリペアドステートメントキャッシュ

プリペアドステートメントは、パフォーマンスを最適化するために使用できる機能です。プリペアドステートメントは、解析、コンパイル、および最適化が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に設定されている場合、プリペアドステートメントキャッシュはその接続に対して自動的に無効になります。