【问题标题】:getting values as strings from database从数据库中获取值作为字符串
【发布时间】:2022-07-21 17:22:57
【问题描述】:

我正在尝试使用 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);
  });
});

【问题讨论】:

    标签: node.js json express


    【解决方案1】:

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

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

    第三,额外的复杂性来自于您要执行 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);
      });
    

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 2013-06-08
      • 2016-04-03
      • 1970-01-01
      • 2011-07-15
      • 2015-07-13
      • 2014-12-26
      • 1970-01-01
      相关资源
      最近更新 更多