Prisma ORMの環境変数と設定の管理
環境変数とは、マシン上のローカル環境に保存される、文字列データのキーと値のペアです。詳細については、弊社の環境変数リファレンスドキュメントをご参照ください。
通常、変数の名前は大文字で、その後に等号、そして変数の値が続きます。
MY_VALUE=prisma
環境変数は、プロセスが実行されている環境に属します。どのプログラムでもこれらの環境変数を読み書きできます。これらは、簡単な情報を保存するための安価で効果的な方法です。
Prisma ORM v6.4.0で、`prisma.config.ts`ファイルをEarly Accessとしてリリースしました。このファイルを使用すると、環境変数と設定をより柔軟に管理できます。
詳細についてはリファレンスをご覧ください。GitHub Discussionsでフィードバックを共有することも忘れないでください!
Prisma ORMが環境変数を使用する方法
Prisma ORMは常にシステムの環境から環境変数を読み取ります。
プロジェクトで`prisma init`を使ってPrisma ORMを初期化すると、connection url
を環境変数として設定するための便利な`.env`ファイルが作成されます。Prisma CLIまたはPrisma Clientを使用すると、`.env`ファイルの内容とそこで定義された変数がprocess.env
オブジェクトに追加され、Prisma ORMがそれを読み取って使用できるようになります。
.env
ファイルを使用する
.env
ファイルをバージョン管理にコミットしないでください!
Prisma CLIは、以下の場所で順に.env
ファイルを探します
- プロジェクトのルートフォルダ (
./.env
) --schema
引数で指定されたスキーマと同じフォルダからpackage.json
の`"prisma": {"schema": "/path/to/schema.prisma"}`から取得されたスキーマと同じフォルダから./prisma
フォルダから
もしステップ1に.env
ファイルがあり、かつステップ2~4に競合する追加の.env
変数が存在する場合、CLIはエラーをスローします。例えば、2つの異なる.env
ファイルでDATABASE_URL
変数を指定すると、以下のエラーが発生します
Error: There is a conflict between env vars in .env and prisma/.env
Conflicting env vars:
DATABASE_URL
We suggest to move the contents of prisma/.env to .env to consolidate your env vars.
以下の表は、Prisma CLIが.env
ファイルを探す場所を示しています
コマンド | スキーマの場所 | 確認される.env ファイルの場所(順序) |
---|---|---|
prisma [コマンド] | ./prisma/schema.prisma | ./.env ./prisma/.env |
prisma [コマンド] --schema=./a/b/schema.prisma | ./a/b/schema.prisma | ./.env ./a/b/.env ./prisma/.env |
prisma [コマンド] | "prisma": {"schema": "/path/to/schema.prisma"} | .env ./path/to/schema/.env ./prisma/.env |
prisma [コマンド] | スキーマなし (例えば、空のディレクトリでprisma db pull を実行する場合) | ./.env ./prisma/.env |
その.env
ファイルで定義されたすべての環境変数は、Prisma CLIコマンド実行時に自動的にロードされます。
複数の.env
ファイルを使用したいですか?アプリケーションで複数の.env
ファイルを設定・使用する方法については、複数の.env
ファイルを使用するを参照してください。
環境変数が2箇所で定義されている場合に何が起こるかについては、dotenv
のドキュメントを参照してください。
.env
ファイルでの変数の展開
.env
ファイルに保存された変数は、dotenv-expandで指定された形式を使用して展開できます。
DATABASE_URL=postgresql://test:test@localhost:5432/test
DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=public
さらに、.env
ファイルの外側で設定された環境変数も展開に使用できます。例えば、HerokuのようなPaaSで設定されたデータベースURLなどです。
# environment variable already set in the environment of the system
export DATABASE_URL=postgresql://test:test@localhost:5432/test
DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=foo
これにより、環境変数DATABASE_URL_WITH_SCHEMA
(値はpostgresql://test:test@localhost:5432/test?schema=foo
)がPrisma ORMで利用できるようになります。
コードで環境変数を使用する
環境変数をランタイムで評価したい場合は、アプリケーションコード内で手動でロードする必要があります(例えば、dotenv
を使用するなど)。
import * as dotenv from 'dotenv'
dotenv.config() // Load the environment variables
console.log(`The connection URL is ${process.env.DATABASE_URL}`)
環境変数にカスタムファイル名を使用している場合、そのファイル名を使用するようにdotenv
を設定できます。
import * as dotenv from 'dotenv'
var envFile = path.resolve(join(__dirname, "myenv.env"))
dotenv.config({path: envFile}) // Load the environment variables
console.log(`The connection URL is ${process.env.DATABASE_URL}`)
環境ファイル間で変数の展開が必要な場合は、さらにdotenv-expand
を使用できます。
import * as dotenv from 'dotenv'
const dotenvExpand = require('dotenv-expand')
var envFile = path.resolve(join(__dirname, "myenv.env"))
var mySqlEnv = dotenv.config({path: envFile})
dotenvExpand.expand(mySqlEnv)
複数の.env
ファイルを使用している場合、実行中の環境に応じてプロジェクトのコード内で環境ファイルを参照できます。
import { config } from 'dotenv'
const envFile = process.env.NODE_ENV === 'development' ? '.env.development' : '.env.production'
config({ path: envFile })
手動で環境変数を設定する
Prisma ORMは環境変数を探す際にシステムの環境から読み取るため、.env
ファイルを完全にスキップして、ローカルシステム上で手動で環境変数を作成することも可能です。
以下の例では、データベース接続URLによく使用されるDATABASE_URL
環境変数を設定します。
Mac/Linuxシステムで環境変数を手動で設定する
Unixマシン(Mac/Linux)のターミナルから、変数をキーと値のペアとしてエクスポートします。
export DATABASE_URL=postgresql://test:test@localhost:5432/test?schema=public
次に、printenv
を使用して正常に設定されていることを確認します。
printenv DATABASE_URL
postgresql://test:test@localhost:5432/test?schema=public
Windowsシステムで環境変数を手動で設定する
以下の例は、コマンドプロンプト(cmd.exe
)とPowerShellの両方を使って、環境変数(現在のユーザー向け)を設定する方法を示しています。
- コマンドプロンプト
- PowerShell
set DATABASE_URL="postgresql://test:test@localhost:5432/test?schema=public"
[Environment]::SetEnvironmentVariable("DATABASE_URL", "postgresql://test:test@localhost:5432/test?schema=public")
次に、正常に設定されていることを確認します。
- コマンドプロンプト
- PowerShell
set DATABASE_URL
Get-ChildItem Env:DATABASE_URL
複数の.env
ファイルを使用する
単一の.env
ファイル内に各環境への異なる接続URLを保存すると、本番データベースが削除されるリスクがあります。
一つの解決策は、それぞれが異なる環境を表す複数の.env
ファイルを持つことです。実際には、これは各環境用にファイルを作成することを意味します。
.env.development
.env.sample
そして、dotenv-cli
のようなパッケージを使用すると、作業している環境に適した接続URLをロードできます。
ここでは、アプリケーション開発中に使用する専用の開発データベースがあることを前提としています。
.env
ファイルを.env.development
にリネームします。
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/dev"
- 新しい
.env.sample
ファイルを作成し、データベース名をsample
(または希望の名前)に変更します。
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/sample"
dotenv-cli
をインストールします。
Prisma ORMとJestがどの.env
ファイルを使用すべきかを知るためには、実行するコマンドと実行したい環境に応じて、dotenv
パッケージを含めて呼び出すようにpackage.json
のスクリプトを変更し、使用するファイルを指定する必要があります。
テストとマイグレーションを実行するトップレベルのスクリプトは、その前にdotenv
コマンドが必要です。これにより、.env.sample
からの環境変数がJestを含むすべてのコマンドに渡されることが保証されます。
異なる環境でマイグレーションを実行する
dotenv-cli
パッケージを使用して、Prisma ORMがマイグレーションを実行する際に使用する環境ファイルを指定できます。
以下のスクリプトは、dotenv-cli
を使用して、.env.sample
環境ファイル(DATABASE_URL
接続文字列を保持)をPrisma ORMマイグレーションスクリプトに渡します。
マイグレーションスクリプト
"scripts": {
"migrate:postgres": "dotenv -e .env.sample -- npx prisma migrate deploy",
},
異なる環境でテストを実行する
テストを実行する際は、Prisma Clientをモックすることをお勧めします。その際、Jestがテストを実行する際にどの環境を使用すべきかを伝える必要があります。
デフォルトでは、Prisma Clientはプロジェクトのルートにあるデフォルトの.env
ファイルで指定された環境を使用します。
テスト用データベースを指定するために別途.env.sample
ファイルを作成した場合、この環境をJestに渡す必要があります。
以下のスクリプトは、dotenv-cli
を使用して、.env.sample
環境ファイル(DATABASE_URL
接続文字列を保持)をJestに渡します。
"scripts": {
"test": "dotenv -e .env.sample -- jest -i"
},