如何修复 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)
但是,如果不知道您的架构是什么样子,这一切都是猜测。
我正在尝试使用 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
fromoffences
' 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)
但是,如果不知道您的架构是什么样子,这一切都是猜测。