findAll() returns 为空,带有 WHERE 选项

findAll() returns empty with WHERE option

关于 Whosebug 的第一个问题,很长一段时间 reader 第一次 post 或者其他人怎么说。

我在空闲时间使用 Discord.js 开发 Discord 机器人,并且我使用 Sequelize 与本地 SQLite 数据库进行交互。我可以很好地向其中插入数据——但是,我似乎无法删除我添加的任何记录。相关代码如下,我认为这是自相矛盾的:

const query3 = await Towers.findAll({
  attributes: ['channelID']
});
console.log(JSON.stringify(query3)); //returns the one Tower

console.log(query3[0].channelID === channel); //returns true(!)

const query2 = await Towers.findAll({
  attributes: ['channelID'],
  where: {channelID: channel}
});
console.log(JSON.stringify(query2)); //returns empty

//DELETE FROM Towers WHERE channelID = channel;
const query = await Towers.destroy({
  where: {channelID: channel}
});
console.log(query); //returns 0, expected behavior given query2 returns empty

我正在尝试通过将频道 ID 传递给它来从 table 命名的 Towers 中删除一条记录,这应该是唯一的。但是,当我使用 WHERE 子句对数据库进行任何查询时,查询 returns 是一个空集——即使在这个例子中,我进行了完整性检查并验证了我试图删除的值是出现在 table。只要存在 WHERE 子句,findAll()findOne() 都会发生这种情况。

(对于 posterity,我已经双重和三次检查了 channelID 的拼写是否正确,并且在所有情况下都使用了正确的大写字母。)

如果需要,我很乐意提供更多信息!

编辑:根据要求,模型定义...

const Towers = sequelize.define('Towers', {
    serverID: {
        type: Sequelize.INTEGER,
        allowNull: false,
    },
    channelID: {
        type: Sequelize.INTEGER,
        unique: true,
        allowNull: false,
    },
    pattern: Sequelize.STRING,
    height: Sequelize.INTEGER,
    delay: Sequelize.BOOLEAN,
});

channel在原文post中的片段被定义为parseInt(interaction.options.getChannel('channel').id).

对于碰巧遇到与我相同问题的任何人,答案是愚蠢的。

我想将 Discord 服务器和频道 ID 存储为整数,即使在调用 API 时它们以字符串形式返回给您。事实证明,Discord 雪花精度高于 JS 使用的 float64 精度。当将字符串解析为整数以将它们插入我的 table 时,值与预期的数字不同,我正在创建错误的记录。

在我的例子中(混淆了实际数字)interaction.options.getChannel('channel').id 返回了“837512533934092340”,而 parseInt(interaction.options.getChannel('channel').id 返回了 837512533934092300。我添加到 table 的数字不知何故少了 40 !

我不确定这是否可以通过使用 BigInt 来解决,但由于无论如何它都会进入不同的结构,我只是耸了耸肩并将模型定义中的 serverId 和 channelId 类型更改为 Sequelize.STRING 并且删除了 parseInt 调用。现在效果很好。

虽然是向 JS 挥拳的好机会。