sequelize-cli执行迁移报Dialect缺失 如何正确配置migration-config.js
报错原因
Dialect needs to be explicity supplied as of v4.0.0 报错的核心原因是sequelize-cli在加载对应运行环境的数据库配置时,没有读取到dialect字段,和配置文件是.js还是.json格式无关。
JS格式迁移配置的参考说明
sequelize-cli没有单独针对migration-config.js的专属文档,.js格式配置的字段规则和官方描述的.json配置规则完全一致,所有支持的配置项和Sequelize构造函数的入参规范完全对齐,sequelize-cli init自动生成的.js模板本身就是官方推荐的标准写法。
修复方案
你当前的配置存在环境匹配的逻辑漏洞:你只给config[process.env.NODE_ENV]赋值了配置,但执行sequelize-cli时如果没有传--env参数,cli会默认读取development环境的配置;如果此时process.env.NODE_ENV未定义、或者值和cli要读取的环境名不匹配,对应环境的配置就是空对象,自然读不到dialect字段触发报错。按以下步骤修复即可:
- 执行迁移命令时显式指定对应环境,避免环境名不匹配,例如生产环境执行迁移的命令为:
npx sequelize-cli db:migrate --env production - 给配置增加环境兜底逻辑,不要完全依赖
process.env.NODE_ENV动态赋值,修改后的可参考配置如下:
require('dotenv').config({ path: `.env.${process.env.NODE_ENV || 'development'}` }); const config = { development: { username: process.env.DB_USER || 'root', password: process.env.DB_PASSWORD || '', database: process.env.DB_NAME || 'dev_db', host: process.env.DB_HOST || '127.0.0.1', port: 3306, dialect: 'mysql' }, production: { username: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, host: process.env.DB_HOST, port: 3306, dialect: 'mysql' } }; module.exports = config;
- 如果你自定义了配置文件名(没有用默认的
config/config.js),需要在项目根目录新建.sequelizerc文件显式指定配置路径,避免cli加载错误的配置文件:
const path = require('path'); module.exports = { config: path.resolve('config', 'migration-config.js'), 'migrations-path': path.resolve('migrations'), 'models-path': path.resolve('models'), 'seeders-path': path.resolve('seeders') };
内容的提问来源于stack exchange,提问作者asceta
相关产品推荐
相关产品推荐

