【问题标题】:How to fix two Knex MySQL queries dependent on each other in a router.get如何修复router.get中相互依赖的两个Knex MySQL查询
【发布时间】:2019-10-17 16:53:59
【问题描述】:

我正在尝试使用 Node、Express 和 JavaScript 在一条路线上显示来自两个数据库表的数据。我已使用 knex 将我的 Express 应用程序连接到数据库,并尝试使用 MySQL SELECT 查询从两个表中获取数据以显示在服务器上。

'offence_columns' 表中的 'column' 属性/列中的数据显示为 'offences' 表中的一列,因此我有两个承诺,其中一个从 'column' 属性中获取数据'offence_columns' 表,另一个选择 'offences' 表中的 'area' 属性和另一个从 'columns' 属性中选择的属性/列。

由于 'column' 是 MySQL 中的保留字,我在选择它时遇到了一些问题。在提供的代码中使用单引号为我提供了终端中的代码:

未处理的拒绝错误:ER_PARSE_ERROR:您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“offences”附近的“0”附近使用正确的语法。

如果我用单引号代替反引号 (column),我会得到同样的错误,但如果我尝试同时使用这两个 ('column'),我会得到一个不同的错误:

错误:ER_BAD_FIELD_ERROR:“字段列表”中的未知列“column”。

我尝试使用别名,但似乎没有帮助。

router.get('/api/search/:offence', function(req, res, next) {
  req.db.from('offence_columns').select('column').where('pretty',"=",req.params.offence)
    .then((rows) => {
      req.db.from('offences').select('area', rows)
        .then((rows2) => {
          res.json({"Error" : false, "Message" : "Success", "City" : rows2})
        })
    })
    .catch((err) => {
      console.log(err);
      res.json({"Error" : true, "Message" : "Error in MySQL query"})
    })
});

【问题讨论】:

    标签: javascript mysql node.js express knex.js


    【解决方案1】:

    首先,考虑调整您的架构。 column 是一个非常糟糕的数据库列名称......它会引起各种混乱,正如您已经发现的那样!

    但是,Knex 通常在其输出中用反引号包围名称,这应该避免保留字问题。这实际上不是你的问题。您看到的是尝试发出包含数组的查询的结果:

    req.db.from('offences').select('area', rows)
    

    这里,rows 是一个数组,它可能为空,也可能不为空。这是上一个查询的结果。

    我怀疑您正在寻找的是更多类似这些方面的东西(猜测,因为我不知道您的架构是什么):

    db.from("offence_columns")
      .select("column")
      .where("pretty", "=", req.params.offence)
      .then(rows => {
        if (rows.length === 0) {
          res.json({ error: false, message: "No cities matched." });
        }
    
        req.db
          .from("offences")
          // This assumes that `offence_columns` has an `area` column
          .where("area", "=", rows[0].area)
          .then(areas => {
            res.json({ Error: false, Message: "Success", city: areas[0] });
          });
      });
    

    这里仍然存在许多问题。一方面,如果任一查询可以返回多个结果怎么办?此外,首先加入可能会更好:

    db
      .select('city')
      .from('offence_columns')
      .join('offences', 'offence_columns.area', '=', 'offences.area')
      .where('pretty', '=', req.params.offence)
    

    但是,在不知道您的架构是什么样子的情况下,这都是猜测。

    【讨论】:

    • 感谢您的帮助。抱歉,我没有很好地解释它,也没有分享架构。我同意列名,如果可以的话我会更改它,但这是一个项目,我无法控制更改任何数据库名称。 'offence_columns' 关系中不存在'area',因此很难加入表格。但是,查看您的代码,我能够从中得到一些东西。我添加了 '[0]' 以从 'req.db.from('offences').select('area', rows[0])' 中的数组中获取第一个结果,这很有效。所以正如你所说,使用数组是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多