首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值作为字符串从数据库中获取

将值作为字符串从数据库中获取
EN

Stack Overflow用户
提问于 2022-07-21 08:19:41
回答 1查看 35关注 0票数 0

我正在尝试获取一行数据(其中有两列),并将SQL查询SELECT * FROM btc WHERE date = '...'作为字符串。SQL从一个行返回所有数据,其中日期是我要查找的数据,而且它是正确的(我在DB浏览器中得到了想要的行),但是由于某种原因,我得到了这个输出:{},知道问题出在哪里吗?这是我的密码:

代码语言:javascript
复制
  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);
  });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-21 08:56:48

首先,db.run不从数据库返回任何数据,必须使用db.get

其次,这些语句是异步执行的,并在它们完成后执行回调函数。但是您只实现了回调函数(err) =>{...}中的错误处理,而不是成功处理。

第三,额外的复杂性来自于您想要执行365个这样的语句。我建议您使用util.promisify将回调风味转换为承诺风味,然后使用Promise.all收集结果:

代码语言:javascript
复制
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请求中检索一年中所有日子的值,可能会快得多:

代码语言:javascript
复制
SELECT * FROM btc WHERE date LIKE "2021-%"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73062856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档