NextJS14+Drizzle ORM+PostgreSQL迁移与ES模块冲突问题求助
解决NextJS14 + Drizzle ORM迁移冲突与最优实践
一、迁移方式的最优选择
你当前用drizzle-kit push:pg直接推送变更的方式并不推荐(除非是开发初期快速迭代),因为它不会记录迁移历史,也无法回滚变更。正确的流程应该是:
- 每次修改schema后,运行
drizzle-kit generate:pg生成带时间戳的迁移文件(默认存放在drizzle/migrations目录) - 通过
drizzle-orm的migrate功能执行迁移,而非直接用push - 迁移历史会自动记录在数据库的
__drizzle_migrations表中,你可以通过SQL查询或drizzle-kit studio可视化查看
二、解决migrate.ts与NextJS启动的冲突问题
你遇到的ReferenceError: module is not defined是因为全局设置"type": "module"后,项目强制使用ES模块,但NextJS的部分配置(比如next.config.js如果用module.exports)依赖CommonJS语法,导致冲突。解决方法如下:
方案1:单独标记迁移文件为ES模块(推荐)
- 移除
package.json中的"type": "module",恢复项目默认模块系统 - 将你的
migrate.ts重命名为migrate.mts(.mts后缀告诉Node.js该文件是ES模块) - 确保
migrate.mts使用ES模块语法(用import/export而非require/module.exports),示例代码:
import { drizzle } from 'drizzle-orm/node-postgres'; import { migrate } from 'drizzle-orm/node-postgres/migrator'; import { Client } from 'pg'; import dotenv from 'dotenv'; dotenv.config(); const client = new Client({ connectionString: process.env.DATABASE_URL, }); async function runMigrations() { try { await client.connect(); const db = drizzle(client); await migrate(db, { migrationsFolder: './drizzle/migrations' }); console.log('Migrations completed successfully'); } catch (err) { console.error('Migration failed:', err); process.exit(1); } finally { await client.end(); } } runMigrations();
- 运行迁移命令:
npx tsx src/migrate.mts - 启动NextJS:
yarn dev,此时不会再出现模块冲突错误
方案2:调整NextJS配置为ES模块(可选)
如果你坚持全局设置"type": "module",需要同步修改next.config.js为ES模块写法:
// next.config.js export default { // 你的NextJS配置项 }
同时确保所有依赖文件都使用ES模块语法,这种方式可能会影响其他第三方依赖,因此不推荐作为首选方案。
三、验证迁移历史
执行完迁移后,你可以通过以下方式查看历史:
- 直接查询数据库:
SELECT * FROM __drizzle_migrations; - 运行
drizzle-kit studio打开Drizzle可视化界面,在界面中查看迁移记录
内容的提问来源于stack exchange,提问作者Dora
相关产品推荐
相关产品推荐

