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

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模块(推荐)

  1. 移除package.json中的"type": "module",恢复项目默认模块系统
  2. 将你的migrate.ts重命名为migrate.mts(.mts后缀告诉Node.js该文件是ES模块)
  3. 确保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();
  1. 运行迁移命令:npx tsx src/migrate.mts
  2. 启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:55