You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drizzle ORM中同时配置生产与测试数据库?

Drizzle ORM (PostgreSQL) 多环境数据库配置最佳方案

你的思路完全没问题,Drizzle ORM 完全支持通过环境变量切换数据库连接的方式,这也是多环境(开发/测试/生产)配置的标准最佳实践,没必要折腾双表模式。下面是具体实现步骤:

1. 配置多环境变量文件

在项目根目录创建不同环境的 .env 文件,分别存储对应环境的数据库连接字符串:

  • .env.development:开发/调试环境
    DATABASE_URL="postgresql://dev_user:dev_pass@localhost:5432/dev_db"
    
  • .env.test:测试环境
    DATABASE_URL="postgresql://test_user:test_pass@localhost:5432/test_db"
    
  • .env.production:生产环境
    DATABASE_URL="postgresql://prod_user:prod_pass@prod-db-host:5432/prod_db"
    

2. 动态加载对应环境变量

根据当前运行的 NODE_ENV 加载对应的 .env 文件。如果是纯 Node.js 项目,可借助 dotenv 包实现:

// src/db/config.js
import { config } from 'dotenv';
import { resolve } from 'path';

// 默认使用开发环境
const env = process.env.NODE_ENV || 'development';
// 加载对应环境的.env文件
config({ path: resolve(__dirname, `../../.env.${env}`) });

如果用 Next.js、NestJS 这类框架,它们自带环境变量加载机制,只需按照框架规则命名文件(比如 Next.js 支持 .env.development、.env.production)即可自动加载。

3. 创建通用的 Drizzle 连接实例

基于加载好的环境变量,创建统一的数据库连接实例,所有环境共用这个实例,仅通过环境变量切换底层数据库:

// src/db/index.js
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import './config'; // 先加载环境变量

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

// 导出通用的db实例
export const db = drizzle(pool);

4. 多环境迁移管理

用 Drizzle Kit 管理数据库迁移时,同样通过 NODE_ENV 切换目标环境。创建 drizzle.config.ts:

// drizzle.config.ts
import type { Config } from 'drizzle-kit';
import { config as dotenvConfig } from 'dotenv';
import { resolve } from 'path';

const env = process.env.NODE_ENV || 'development';
dotenvConfig({ path: resolve(__dirname, `.env.${env}`) });

export default {
  schema: './src/db/schema/**/*.ts', // 你的schema文件路径
  out: './drizzle', // 迁移文件输出目录
  driver: 'pg',
  dbCredentials: {
    connectionString: process.env.DATABASE_URL!,
  },
} satisfies Config;

然后在 package.json 中添加环境专属的迁移脚本:

{
  "scripts": {
    "db:migrate:dev": "NODE_ENV=development drizzle-kit push:pg",
    "db:migrate:test": "NODE_ENV=test drizzle-kit push:pg",
    "db:migrate:prod": "NODE_ENV=production drizzle-kit push:pg",
    "db:studio:dev": "NODE_ENV=development drizzle-kit studio"
  }
}

可选:用数据库 Schema 隔离环境(不推荐)

如果坚持用同一数据库下的不同 Schema 隔离环境,也可以通过环境变量指定 Schema:

  1. 在 .env 文件中添加 DB_SCHEMA:
    DB_SCHEMA="dev_schema" # 开发环境
    DB_SCHEMA="prod_schema" # 生产环境
    
  2. 修改 Drizzle 连接实例:
    export const db = drizzle(pool, {
      schema: process.env.DB_SCHEMA || 'public',
    });
    
  3. 在 Schema 定义时,为表指定 Schema(可选,若全局指定则无需单独设置):
    import { pgTable } from 'drizzle-orm/pg-core';
    
    export const users = pgTable('users', { id: serial('id').primaryKey() }, {
      schema: process.env.DB_SCHEMA,
    });
    

不过这种方式不如分数据库隔离彻底,容易出现权限或数据污染问题,优先推荐分库方案。


内容的提问来源于stack exchange,提问作者user1763684

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:20