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

执行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表的迁移文件(规范做法)

适合长期维护场景,确保迁移流程完整:

  1. 基于现有story模型生成创建表的迁移文件,替换字段与类型为实际表结构:
    npx sequelize-cli model:generate --name story --attributes title:string,description:text,...
    
  2. 执行新建的创建表迁移:
    npx sequelize-cli db:migrate
    
  3. 再次执行原添加storyNumber列的迁移,此时表已存在即可正常执行。

方案2:手动标记创建表的迁移已完成(适合已有数据场景)

若数据库中已通过sync()创建表且不想丢失数据,可手动向迁移记录表添加记录:

  1. 打开SQLite数据库文件:
    sqlite3 localDB
    
  2. 向SequelizeMeta表插入记录,模拟创建story表的迁移已执行(时间戳需早于现有迁移文件的20210622124450):
    INSERT INTO SequelizeMeta (name) VALUES('20210622100000-create-story.js');
    
  3. 输入.exit退出SQLite控制台,重新执行迁移命令:
    npx sequelize-cli db:migrate
    

后续注意事项

  • 避免同时混用sync()自动建表与Sequelize迁移系统:迁移系统适合团队协作与生产环境,可追踪所有变更并支持回滚;sync()仅适合开发阶段快速验证。
  • 生产环境必须使用迁移系统,规避sync()的潜在风险(如force: true会清空表数据)。

内容的提问来源于stack exchange,提问作者Aleksej Markovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:40:47