如何在SvelteKit中用process.env配置Drizzle连接PostgreSQL?
在SvelteKit中配置Drizzle + PostgreSQL环境变量的最佳实践
为什么$env/static/private无法直接用于drizzle.config.ts
Drizzle Kit的配置文件由Node.js直接执行,不属于SvelteKit的Vite构建流程,因此无法识别SvelteKit专属的$env模块——这类模块是Vite注入的,仅在src/目录下的SvelteKit源码文件中可用。
方案一:用dotenv加载环境变量(推荐,通用型最强)
这是Drizzle官方推荐的方式,直接在配置文件中读取.env文件,无需依赖SvelteKit的环境变量系统。
实现步骤:
- 安装dotenv依赖:
npm install dotenv --save-dev
- 修改
drizzle.config.ts:
import { defineConfig } from 'drizzle-kit'; import dotenv from 'dotenv'; // 加载根目录的.env文件 dotenv.config({ path: '.env' }); // 为TypeScript添加全局环境变量类型提示 declare global { namespace NodeJS { interface ProcessEnv { DB_HOST: string; DB_PORT: string; DB_USER: string; DB_PASSWORD: string; DB_NAME: string; } } } export default defineConfig({ schema: './src/lib/server/schema.ts', out: './drizzle', dialect: 'postgresql', dbCredentials: { host: process.env.DB_HOST, // 注意:Drizzle要求port为数字类型,需转换字符串变量 port: parseInt(process.env.DB_PORT), user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, }, });
- 确保根目录下的
.env文件配置正确:
DB_HOST=localhost DB_PORT=5432 DB_USER=postgres DB_PASSWORD=your_db_password DB_NAME=your_db_name
该方案优势:
- 完全独立于SvelteKit环境变量系统,Drizzle Kit可直接读取
- 类型提示清晰,避免TypeScript报错
- 兼容所有Node.js运行环境,开发/生产场景通用
方案二:将Drizzle运行时配置移至SvelteKit Server目录(深度整合场景)
若希望完全依托SvelteKit的$env模块,可将Drizzle的运行时连接配置移至src/lib/server/目录,同时保留根目录的drizzle.config.ts用于迁移操作(仍需用dotenv)。
实现步骤:
- 创建
src/lib/server/db.ts(用于应用运行时的数据库连接):
import { drizzle } from 'drizzle-orm/postgres-js'; import postgres from 'postgres'; import { env } from '$env/static/private'; const client = postgres({ host: env.DB_HOST, port: parseInt(env.DB_PORT), user: env.DB_USER, password: env.DB_PASSWORD, database: env.DB_NAME, }); export const db = drizzle(client);
- 根目录的
drizzle.config.ts仍采用方案一的dotenv配置,用于Drizzle Kit的迁移命令执行。
常见问题解决
- TypeScript提示
process.env不存在:在tsconfig.json的compilerOptions中添加"node": true,让TypeScript识别Node.js全局变量。 DB_PORT类型错误:Drizzle要求端口为数字,必须用parseInt()转换环境变量的字符串值。- 环境变量加载失败:检查
.env文件路径是否正确,若文件不在根目录,需在dotenv.config()中指定path参数。
内容的提问来源于stack exchange,提问作者Sam Sabin
相关产品推荐
相关产品推荐

