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

使用Sequelize创建模型后仍提示‘no such table’问题求助

问题:Sequelize同步数据库无报错,但Discord命令提示表不存在
  • 使用Sequelize创建cities模型,手动运行db-init.js进行数据库同步时无报错
  • 执行Discord.js的/found命令时,抛出错误:Error: SQLITE_ERROR: no such table: cities
  • 此前相同代码可正常运行,本次出现异常

相关代码

models/cities.js

const { Sequelize, DataTypes } = require('sequelize');

const db = new Sequelize({
    dialect: 'sqlite',
    storage: './database.sqlite',
});

const Cities = db.define('cities', {
    userId: {
        type: DataTypes.STRING,
        unique: true,
        primaryKey: true,
        allowNull: false,
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false,
    },
    // ...
    busStationsBuilt: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
    },
});

module.exports = { Cities };

db-init.js(手动运行)

const { Sequelize } = require('sequelize');

const db = new Sequelize({
    dialect: 'sqlite',
    storage: './database.sqlite',
});

require('./models/cities.js');

const force = process.argv.includes('--force') || process.argv.includes('-f');

db.sync({ force }).then(async () => {
    console.log('Database synced.');

    db.close();
}).catch(console.error);

commands/found.js

const { Cities } = require('../models/cities.js');
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('found')
        .setDescription('Found your city!')
        .addStringOption(option =>
            option
                .setName('name')
                .setDescription('The name of your city!')
                .setRequired(true)
        ),
    async execute(interaction) {
        const name = interaction.options.getString('name');

        const cityAlreadyExists = await Cities.findOne({ where: { userId: interaction.user.id } });

        if (!cityAlreadyExists) {
            try {
                const city = await Cities.create({
                    userId: interaction.user.id,
                    name: name,
                });

                const cityEmbed = new EmbedBuilder()
                    .setColor(0x73a0d0)
                    .setTitle(city.name)
                    .setDescription('Here are your city\'s stats:')
                    .addFields(
                        { name: '😄 Happiness:', value: city.happiness },
                        { name: '🧍 Population:', value: city.population },
                        { name: '💵 Balance:', value: city.balance },
                        { name: '🪨 Resources:', value: city.resources },
                        { name: '👨‍👩‍👧‍👦 Crowdedness:', value: city.crowdedness },
                        { name: '🚗 Traffic:', value: city.traffic },
                        { name: '🛢️ Pollution:', value: city.pollution },
                    );

                return interaction.reply({ content: 'Your city has been created!', embeds: [cityEmbed] });
            } catch (error) {
                await interaction.reply({ content: 'An error occurred while creating your city. Support server: https://discord.gg/XuZNNJbf4U', ephemeral: true });
                return console.error(error);
            }
        } else {
            return interaction.reply('Your city already exists!');
        }
    }
}

问题原因及解决方法

核心原因:重复创建Sequelize实例

models/cities.js和db-init.js各自创建了独立的Sequelize实例,导致db-init.js中的sync操作并未关联到模型定义的实例,实际没有生成cities表。

解决步骤

  1. 抽离统一的数据库连接实例
    新建db.js文件,统一管理Sequelize连接:

    const { Sequelize } = require('sequelize');
    const db = new Sequelize({
        dialect: 'sqlite',
        storage: './database.sqlite',
    });
    module.exports = db;
    
  2. 修改模型文件关联统一实例
    更新models/cities.js,引入统一的db实例:

    const { DataTypes } = require('sequelize');
    const db = require('../db.js'); // 替换原有的Sequelize实例创建代码
    
    const Cities = db.define('cities', {
        userId: {
            type: DataTypes.STRING,
            unique: true,
            primaryKey: true,
            allowNull: false,
        },
        name: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        busStationsBuilt: {
            type: DataTypes.INTEGER,
            allowNull: false,
            defaultValue: 0,
        },
        // 保留其他字段定义...
    });
    
    module.exports = { Cities };
    
  3. 修改初始化文件使用统一实例
    更新db-init.js,使用统一的db实例:

    const db = require('./db.js');
    require('./models/cities.js'); // 模型自动关联到统一实例
    
    const force = process.argv.includes('--force') || process.argv.includes('-f');
    
    db.sync({ force }).then(async () => {
        console.log('Database synced.');
        db.close();
    }).catch(console.error);
    
  4. 验证路径并重新同步

    • 确认database.sqlite的路径在Discord bot和db-init.js运行时一致(均为项目根目录)
    • 运行node db-init.js --force强制重新生成表,确保表被正确创建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:10:29