我在用Knex做这样的查询。
const query = knex
.select('ue.username', 'ue.permission', 'ue.status')
.from('user_entity as ue')
.join('device_entity as de', function () {
this
.on('de.username', '=', 'ue.username')
.andOn({'de.deleted': ''})
.andOn({'de.token': token})
.andOn({'de.uid': uid});
})
.where({'ue.deleted': ''})Node.js控制台显示了这一点。在标记条件下,由于某种原因,将生成(‘)并将(’‘)替换为(“"),查询正常工作。但我不明白他为什么用(‘’)生成SQL
select `ue`.`username`, `ue`.`permission`, `ue`.`status`
from `user_entity` as `ue`
inner join `device_entity` as `de`
on `de`.`username` = `ue`.`username`
and `de`.`deleted` = ``
and `de`.`token` = `C0AbKXv2ffWS7w`
and `de`.`uid` = `F8F9C9A8-06CC-40E4-AE8E-75FE7FA6BB57`
where `ue`.`deleted` = ''SQL应该是..。
select `ue`.`username`, `ue`.`permission`, `ue`.`status`
from `user_entity` as `ue`
inner join `device_entity` as `de`
on `de`.`username` = `ue`.`username`
and `de`.`deleted` = ''
and `de`.`token` = 'C0AbKXv2ffWS7w'
and `de`.`uid` = 'F8F9C9A8-06CC-40E4-AE8E-75FE7FA6BB57'
where `ue`.`deleted` = ''带有内部联接但Knex的查询在“内部连接的条件(和)”中生成(‘’)而不是(“")。
发布于 2022-11-18 07:07:06
on子句基本上将所有内容解析为列名,因此您的所有值都用`包装,用于mysql标识符,如表名或列名。
如果您使用类型记录,或者使用javascript来支持像vscode这样的解析类型记录语法,那么您可以签出.join()的类型定义。
interface JoinClause {
on(raw: Raw): JoinClause;
on(callback: JoinCallback): JoinClause;
on(columns: { [key: string]: string | Raw }): JoinClause; // <--------
on(column1: string, column2: string): JoinClause;
on(column1: string, raw: Raw): JoinClause; // <-----------------------
...
}如您所见,字符串参数是column*。如果要根据非列值添加条件,则应使用Raw值通过knex.raw()传递。
knex("user_entity as ue")
.select('ue.username', 'ue.permission', 'ue.status')
.join('device_entity as de', (j)=> (
j
.on('de.username', '=', 'ue.username')
.andOn({'de.deleted': knex.raw("?","")})
.andOn({'de.token': knex.raw("?","iMoENdVC5hSUwr")})
.andOn({'de.uid': knex.raw("?","TPB4.220624.004")})
))
.where({'ue.deleted': ''})https://stackoverflow.com/questions/74395075
复制相似问题