如何修复 router.get 中相互依赖的两个 Knex MySQL 查询

How to fix two Knex MySQL queries dependent on each other in a router.get

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

'column' attribute/column 中的数据在 'offence_columns' table 中显示为 'offences' table 中的一列,因此为什么我有两个承诺,一个是从 'offence_columns' table 中的 'column' 属性获取数据,另一个是选择 [=32] 中的 'area' 属性=] table 和另一个 attribute/column 是从 'columns' 属性中选择的。

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

Unhandled rejection Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as 0 from offences' at line 1.

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

Error: ER_BAD_FIELD_ERROR: Unknown column 'column' in 'field list'.

我试过使用别名,但似乎没有用。

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"})
    })
});

首先,考虑调整架构。 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] });
      });
  });

这里还有很多问题。一方面,如果任一查询可以 return 多个结果怎么办?此外,您最好先加入一个:

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

但是,如果不知道您的架构是什么样子,这一切都是猜测。