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 挥拳的好机会。
关于 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 挥拳的好机会。