使用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表。
解决步骤
抽离统一的数据库连接实例
新建db.js文件,统一管理Sequelize连接:const { Sequelize } = require('sequelize'); const db = new Sequelize({ dialect: 'sqlite', storage: './database.sqlite', }); module.exports = db;修改模型文件关联统一实例
更新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 };修改初始化文件使用统一实例
更新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);验证路径并重新同步
- 确认
database.sqlite的路径在Discord bot和db-init.js运行时一致(均为项目根目录) - 运行
node db-init.js --force强制重新生成表,确保表被正确创建
- 确认
内容的提问来源于stack exchange,提问作者TacoSnack
相关产品推荐
相关产品推荐

