我正在尝试获取一行数据(其中有两列),并将SQL查询SELECT * FROM btc WHERE date = '...'作为字符串。SQL从一个行返回所有数据,其中日期是我要查找的数据,而且它是正确的(我在DB浏览器中得到了想要的行),但是由于某种原因,我得到了这个输出:{},知道问题出在哪里吗?这是我的密码:
const sqlite3 = require('sqlite3').verbose()
const db = new sqlite3.Database("./server/coin.db", sqlite3.OPEN_READWRITE, (err) =>{
if (err) return console.error(err.message);
console.log("connection successfull")
});
console.log("entered bitcoin query!");
let msg = "";
for (let m = 1; m<= 12; m++)
{
if (m==1 || m==3 || m==5 || m == 7 || m == 8 || m == 10 || m == 12)
{
for (let d = 1; d<= 31; d++)
{
if(d<10 && m<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-0" + d + '"';
console.log(sql);
}
else if (m<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-" + d + '"';
}
else if (d<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-' + m + "-0" + d + '"';
}
else
{
sql = 'SELECT * FROM btc WHERE date = "2021-' + m + "-" + d + '"';
}
msg = msg + JSON.stringify(db.run(sql, (err) =>{
if (err) return console.error(err.message);
}));
}
}
if(m==4 || m==6 || m==9 || m==11)
{
for (let d = 1; d<= 30; d++)
{
if(d<10 && m<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-0" + d + '"';
}
else if (m<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-" + d + '"';
}
else if (d<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-' + m + "-0" + d + '"';
}
else
{
sql = 'SELECT * FROM btc WHERE date = "2021-' + m + "-" + d + '"';
}
msg = msg + JSON.stringify(db.run(sql, (err) =>{
if (err) return console.error(err.message);
}));
}
}
if (m == 2)
{
for (let d = 1; d<= 28; d++)
{
if (d<10)
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-0" + d + '"';
}
else
{
sql = 'SELECT * FROM btc WHERE date = "2021-0' + m + "-" + d + '"';
}
msg = msg + JSON.stringify(db.run(sql, (err) =>{
if (err) return console.error(err.message);
}));
}
}
console.log(msg);
}
res.json({ message: msg });
db.close((err) =>{
if (err) return console.error(err.message);
});
});发布于 2022-07-21 08:56:48
首先,db.run不从数据库返回任何数据,必须使用db.get。
其次,这些语句是异步执行的,并在它们完成后执行回调函数。但是您只实现了回调函数(err) =>{...}中的错误处理,而不是成功处理。
第三,额外的复杂性来自于您想要执行365个这样的语句。我建议您使用util.promisify将回调风味转换为承诺风味,然后使用Promise.all收集结果:
let getPromise = util.promisify(db.get.bind(db));
let queries = [];
for (let m = 1; m <= 12; m++) {
let dmax = /* number of days of that month */
for (let d = 1; d <= dmax; d++) {
let sql;
/* Let sql = SELECT statement string depending on m and d. */
queries.push(getPromise(sql));
}
}
Promise.all(queries).then(
function(results) {
res.json({message: results});
}, function(err) {
console.error(err.message);
});最后,如果您在一个SQL请求中检索一年中所有日子的值,可能会快得多:
SELECT * FROM btc WHERE date LIKE "2021-%"https://stackoverflow.com/questions/73062856
复制相似问题