Prisma中的环境变量

  在开发过程中我们经常遇到环境变量的问题,本文提供了一个 Prisma 从不同 .env 文件中读取数据库 URL 的方案。

遇到问题

Next支持.env.env.development.env.production.env.local这样的环境变量,可以在生产和开发环境中使用不同的环境变量。但是如果我使用prisma管理数据库,就会遇到prisma的指令无法正确根据我当前的环境读取不同的数据库URL的情况。

相关知识

Next的环境变量

以下内容来自:环境变量 | Next.js 中文文档

  • .env:默认环境(所有环境都生效,最低优先级)
  • .env.development:生产环境(next dev时生效)
  • .env.production:开发环境(next start时生效)
  • .env.local:本地环境(所有环境都生效,最高优先级)
  • 优先级:.env>.env.development/.env.production>.env.local

dotenv

dotenv 是一个 Node.js 库,用于从 .env 文件中加载环境变量到 process.env 中。

Prisma 中,命令行默认从.env文件中读取文件,如果要指定其他的环境变量文件,就需要用到它的命令行工具 dotenv-cli

安装:yarn add dotenv-cli -D

语法:dotenv -e 环境变量文件 -- 后续命令

例如:dotenv -e .env.development -- prisma db push

NODE_ENV

NODE_ENVNode.js 应用中一个及其重要的环境变量,可以标识当前的运行环境(开发、生产、测试),我们可以在页面里使用它来实现开发环境自动填写测试用密码、跳过某些权限校验之类。

下面这个文件,可以实现在使用node 文件时直接指定环境,而不用单独配置。

executor.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const { spawn } = require("child_process")

// 默认配置
let env = { ...process.env } // 保留原有环境变量
let fileToExecute = null // 主逻辑文件路径

// 解析命令行参数
process.argv.forEach(arg => {
// 设置环境变量
if (arg.startsWith("--env=")) {
env.NODE_ENV = arg.split("=")[1]
}
// 获取文件路径
if (arg.startsWith("--file=")) {
fileToExecute = arg.split("=")[1]
}
})

// 检查是否指定了主逻辑文件
if (!fileToExecute) {
console.error("Error: No file specified. Use --file=<path-to-file> to specify the file.")
process.exit(1)
}

// 输出调试信息
console.log("NODE_ENV:", env.NODE_ENV)
console.log("Executing file:", fileToExecute)

// 使用子进程执行指定的文件
const child = spawn("node", [fileToExecute], { env, stdio: "inherit" })

child.on("exit", code => {
console.log(`Child process exited with code ${code}`)
})

用法:node executor.js --env=production --file=./e.js

解决方案

分别在.env.development.env.production中写数据库的连接 URL ,然后在package.json中写对应脚本来执行数据操作。

1
2
3
4
"scripts": {
"push:dev": "dotenv -e .env.development -- prisma db push",
"push:pro": "dotenv -e .env.production -- prisma db push"
}
作者

Fu9Zhou

发布于

2025-01-12

许可协议