执行Sequelize迁移时出现SQLITE_ERROR: no such table: story错误的解决方法
问题
执行Sequelize迁移时出现SQLITE_ERROR: no such table: story错误,相关信息如下:
控制台输出
C:\scrumboard-praktikant>npx sequelize-cli db:migrate Sequelize CLI [Node: 16.17.0, CLI: 6.4.1, ORM: 5.22.5] Loaded configuration file "config\config.json". Using environment "development". == 20210622124450-modify_story_add_storyNumber: migrating ======= ERROR: SQLITE_ERROR: no such table: story
配置文件(config/config.json)
{ "development": { "database": "localDB", "dialect": "sqlite", "redBotStoryStateUrl": "http://localhost:5000/storystate?", "address": "http://localhost:3001", "refreshStateAllMs": 10000, "listenOnPort": 3001, "checkStoryState": false }, "production": { "username": "scrumboard", "database": "scrumboard", "host": "127.0.0.1", "password": "scrumboard", "dialect": "mysql", "redBotStoryStateUrl": "http://localhost:5000/storystate?", "address": "http://localhost:3001", "refreshStateAllMs": 10000, "listenOnPort": 5001, "checkStoryState": true, "mysqlDump": "C:\\Program Files\\MySQL\\MySQL Workbench 8.0 CE\\mysqldump.exe", "directory": "C:\\scrumboard_dbbackup" } }
迁移文件(20210622124450-modify_story_add_storyNumber.js)
'use strict'; module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.addColumn('story', 'storyNumber', { type: Sequelize.STRING, allowNull: true, }) }, down: (queryInterface, Sequelize) => { return queryInterface.removeColumn('story', 'storyNumber') } };
问题详情
执行上述迁移命令时触发表不存在错误,但使用npm start启动程序时,程序会自动创建story表且运行正常,无法执行目标迁移文件,该如何解决?
解决方案
问题根源
程序启动时通过Sequelize的sync()方法(代码中调用model.sync())自动创建了story表,但Sequelize CLI的迁移系统与自动建表是两套独立机制:迁移系统仅按文件顺序执行已定义的变更,不会识别sync()创建的表,因此执行添加列的迁移时,数据库中无对应表导致报错。
方案1:补建创建story表的迁移文件(规范做法)
适合长期维护场景,确保迁移流程完整:
- 基于现有
story模型生成创建表的迁移文件,替换字段与类型为实际表结构:npx sequelize-cli model:generate --name story --attributes title:string,description:text,... - 执行新建的创建表迁移:
npx sequelize-cli db:migrate - 再次执行原添加
storyNumber列的迁移,此时表已存在即可正常执行。
方案2:手动标记创建表的迁移已完成(适合已有数据场景)
若数据库中已通过sync()创建表且不想丢失数据,可手动向迁移记录表添加记录:
- 打开SQLite数据库文件:
sqlite3 localDB - 向
SequelizeMeta表插入记录,模拟创建story表的迁移已执行(时间戳需早于现有迁移文件的20210622124450):INSERT INTO SequelizeMeta (name) VALUES('20210622100000-create-story.js'); - 输入
.exit退出SQLite控制台,重新执行迁移命令:npx sequelize-cli db:migrate
后续注意事项
- 避免同时混用
sync()自动建表与Sequelize迁移系统:迁移系统适合团队协作与生产环境,可追踪所有变更并支持回滚;sync()仅适合开发阶段快速验证。 - 生产环境必须使用迁移系统,规避
sync()的潜在风险(如force: true会清空表数据)。
内容的提问来源于stack exchange,提问作者Aleksej Markovic
相关产品推荐
相关产品推荐

