我正在尝试使用Node,Express和JavaScript在一条路线上显示来自两个数据库表的数据。我是JavaScript的新手,尤其是Node和Express的新手。我已使用knex将Express应用程序连接到数据库,并尝试使用MySQL SELECT查询从两个表中获取数据以显示在服务器上。
“ offence_columns”表中“ column”属性/ column中的数据显示为“ offences”表中的一列,因此为什么我有两个promise,其中一个来自promise中“ column”属性的数据“ offence_columns”表,另一个在“ offences”表中选择“ area”属性,另一个是从“ columns”属性中选择的另一个属性/列。
由于“列”是MySQL中的保留字,因此在选择它时遇到了一些问题。像提供的代码中那样使用单引号为终端提供了一个代码:
未处理的拒绝错误:ER_PARSE_ERROR:您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“
0
中的{asoffences
}附近使用”。
如果我用单引号代替反引号(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"})
})
});
答案 0 :(得分: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)
但是,所有这些工作都是在不知道您的架构是什么样的情况下进行的。