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

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ファイルを探します

  1. プロジェクトのルートフォルダ (./.env)
  2. --schema引数で指定されたスキーマと同じフォルダから
  3. package.jsonの`"prisma": {"schema": "/path/to/schema.prisma"}`から取得されたスキーマと同じフォルダから
  4. ./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で指定された形式を使用して展開できます。

.env
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
.env
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
表示CLI結果
postgresql://test:test@localhost:5432/test?schema=public

Windowsシステムで環境変数を手動で設定する

以下の例は、コマンドプロンプト(cmd.exe)とPowerShellの両方を使って、環境変数(現在のユーザー向け)を設定する方法を示しています。

set DATABASE_URL="postgresql://test:test@localhost:5432/test?schema=public"

次に、正常に設定されていることを確認します。

set DATABASE_URL

複数の.envファイルを使用する

単一の.envファイル内に各環境への異なる接続URLを保存すると、本番データベースが削除されるリスクがあります。

一つの解決策は、それぞれが異なる環境を表す複数の.envファイルを持つことです。実際には、これは各環境用にファイルを作成することを意味します。

  • .env.development
  • .env.sample

そして、dotenv-cliのようなパッケージを使用すると、作業している環境に適した接続URLをロードできます。

情報

ここでは、アプリケーション開発中に使用する専用の開発データベースがあることを前提としています。

  1. .envファイルを.env.developmentにリネームします。
.env.development
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/dev"
  1. 新しい.env.sampleファイルを作成し、データベース名をsample(または希望の名前)に変更します。
.env.sample
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/sample"
  1. 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マイグレーションスクリプトに渡します。

マイグレーションスクリプト

package.json
  "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に渡します。

package.json
  "scripts": {
"test": "dotenv -e .env.sample -- jest -i"
},
© . All rights reserved.