跳到主要内容

管理 Prisma ORM 环境变量和设置

环境变量是存储在您机器本地环境中的字符串数据键值对。请参阅我们的环境变量参考文档以获取详细信息。

通常变量名是大写的,后面跟着一个等号,然后是变量的值

MY_VALUE=prisma

环境变量属于进程运行的环境。任何程序都可以读取和创建这些环境变量。它们是存储简单信息的一种廉价且有效的方法。

提示

Prisma ORM v6.4.0 发布了 prisma.config.ts 文件,并已进入抢先体验阶段。此文件允许您以更灵活的方式管理环境变量和设置。

查看我们的参考以获取更多信息,并且不要忘记在我们的 GitHub 讨论中分享您的反馈

Prisma ORM 如何使用环境变量

Prisma ORM 总是从系统环境中读取环境变量。

当您使用 prisma init 在项目中初始化 Prisma ORM 时,它会为您创建一个便捷的 .env 文件,以便将您的 连接 URL 设置为环境变量。当您使用 Prisma CLI 或 Prisma Client 时,.env 文件内容及其定义的变量会被添加到 process.env 对象中,Prisma ORM 可以在其中读取和使用它。

使用 .env 文件

警告

不要将您的 .env 文件提交到版本控制中!

Prisma CLI 按顺序在以下位置查找 .env 文件

  1. 在您项目的根文件夹中 (./.env)
  2. --schema 参数指定的 schema 所在文件夹中
  3. package.json"prisma": {"schema": "/path/to/schema.prisma"} 所在文件夹中
  4. ./prisma 文件夹中

如果 .env 文件位于第 1 步中,但额外的、冲突的 .env 变量位于第 2 - 4 步中,CLI 将抛出错误。例如,如果您在两个不同的 .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 文件

命令schema 位置按顺序检查的 .env 文件位置
prisma [command]./prisma/schema.prisma./.env
./prisma/.env
prisma [command] --schema=./a/b/schema.prisma./a/b/schema.prisma./.env
./a/b/.env
./prisma/.env
prisma [command]"prisma": {"schema": "/path/to/schema.prisma"}.env
./path/to/schema/.env
./prisma/.env
prisma [command]无 schema (例如,在空目录中运行 prisma db pull 时)./.env
./prisma/.env

在该 .env 文件中定义的任何环境变量将在运行 Prisma CLI 命令时自动加载。

信息

想使用多个 .env 文件?请参阅使用多个 .env 文件以获取如何在应用程序中设置和使用多个 .env 文件的信息。

有关如果环境变量在两个地方定义会发生什么的信息,请参阅 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

这将使值为 postgresql://test:test@localhost:5432/test?schema=foo 的环境变量 DATABASE_URL_WITH_SCHEMA 可供 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 文件,并在本地系统上手动创建它们。

信息

以下示例将使用设置 DATABASE_URL 环境变量,该变量常用于数据库连接 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 文件,请修改您的 package.json 脚本,以包含并调用 dotenv 包,并根据您正在运行的命令以及希望它们运行的环境来指定要使用的文件。

信息

任何运行测试和迁移的顶层脚本都需要在它之前加上 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.