Node.js - 将 SQL 查询转换为 Knex.js
Node.js - Converting a SQL query into Knex.js
我有一个 SQL 查询 (Postgres),其中包含多个 join
,但我无法将其转换为单个 Knex.js 语句。这是 SQL 查询:
SELECT
User.id, User.name, User.email,
Role.name AS r_name,
UserPofile.id AS p_id, UserPofile.date_of_birth AS p_dob,
AuthToken.id AS at_id, AuthToken.token AS at_token, AuthToken.platform AS at_platform
FROM public."user" User
LEFT JOIN public."user_role" UserRole ON User.id = UserRole.user_id
LEFT JOIN public."role" Role ON UserRole.role_id = Role.id
LEFT JOIN public."application" Application ON UserProfile.app_id = Application.id
LEFT JOIN public."user_profile" UserProfile ON User.id = UserProfile.user_id
LEFT JOIN public."auth_token" AuthToken ON User.id = AuthToken.user_id
WHERE
User.email LIKE 'some@email.com' AND
Application.name LIKE 'awesome-application' AND
AuthToken.platform LIKE 'mobile';
这是我的 Knex.js 代码:
return knex('user').where({ email:'some@email.com' })
.select([
'user.id', 'user.name', 'user.email' // User
'role.name AS rName' // Roles
'user_profile.id AS pId', 'user_profile.date_of_birth AS pDob' // UserProfiles
'auth_token.id AS atId' 'auth_token.platform AS atPlatform', 'auth_token.token AS atToken' // AuthTokens
])
.leftJoin('user_profile', 'user_profile.user_id', 'user.id')
.leftJoin('user_role', 'user_role.user_id', 'user.id')
.leftJoin('role', 'role.id', 'user_role.role_id')
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.then(users => {
users = users.filter(user => {
return user.pApp_id === appId && user.atApp_id === appId && user.atPlatform === platform;
});
return users;
});
这会产生与 SQL 查询相同的结果,但问题是我必须在 Knex 调用的 .then()
子句中过滤 returned 用户,因为我不知道如何为 Application.name
和 AuthToken.platform
添加 WHERE
条件。
问题:
谁能帮我弄清楚如何构造我的 Knex 代码的 .where()
子句,使其等同于 SQL 查询?
备注:
- 我不知道如何
console.log
Knex 生成的 SQL 查询,因此我不完全确定我当前的 Knex 代码是否会生成上面的 SQL 查询它(减去正确的 WHERE
子句)。我已经检查过它实际上 return 相同的结果,通过 运行 PgAdmin 中的查询和 console.log()
ing users
returned 从Knex 功能。
- 我没有包含定义此问题中使用的表和列的
CREATE TABLE
/ Knex 迁移,因为对我来说它没有必要,而且我不想已经长问题甚至更长。但是,如果您需要查看它,请随时告诉我。我很乐意包含它。
最简单的解决方案是使用 .whereRaw()
:
示例:
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.whereRaw('User.email LIKE ?', `${your_param_here}`)
.andWhereRaw('AuthToken.platform LIKE ?', `${your_param_here}`)
要调试,您可以使用 .toSQL()
来调试您的 knex 查询 documentation。
还有,不错 cheatsheet
作为热修复解决方案,您可以使用 .raw()
并将您的 SQL 代码粘贴到那里。
关于 WHERE
条件,您可以将它们链接在 knex 查询的末尾。
像这样:
return knex('user')
.select('user.id', 'user.name', 'user.email',
'role.name AS rName'
'user_profile.id AS pId', 'user_profile.date_of_birth AS pDob',
'auth_token.id AS atId' 'auth_token.platform AS atPlatform', 'auth_token.token AS atToken'
)
.leftJoin('user_profile', 'user_profile.user_id', 'user.id')
.leftJoin('user_role', 'user_role.user_id', 'user.id')
.leftJoin('role', 'role.id', 'user_role.role_id')
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.where('user.email', 'like', '%some@email.com%')
.andWhere('application.name', 'like' '%awesome-application%')
//...etc
我有一个 SQL 查询 (Postgres),其中包含多个 join
,但我无法将其转换为单个 Knex.js 语句。这是 SQL 查询:
SELECT
User.id, User.name, User.email,
Role.name AS r_name,
UserPofile.id AS p_id, UserPofile.date_of_birth AS p_dob,
AuthToken.id AS at_id, AuthToken.token AS at_token, AuthToken.platform AS at_platform
FROM public."user" User
LEFT JOIN public."user_role" UserRole ON User.id = UserRole.user_id
LEFT JOIN public."role" Role ON UserRole.role_id = Role.id
LEFT JOIN public."application" Application ON UserProfile.app_id = Application.id
LEFT JOIN public."user_profile" UserProfile ON User.id = UserProfile.user_id
LEFT JOIN public."auth_token" AuthToken ON User.id = AuthToken.user_id
WHERE
User.email LIKE 'some@email.com' AND
Application.name LIKE 'awesome-application' AND
AuthToken.platform LIKE 'mobile';
这是我的 Knex.js 代码:
return knex('user').where({ email:'some@email.com' })
.select([
'user.id', 'user.name', 'user.email' // User
'role.name AS rName' // Roles
'user_profile.id AS pId', 'user_profile.date_of_birth AS pDob' // UserProfiles
'auth_token.id AS atId' 'auth_token.platform AS atPlatform', 'auth_token.token AS atToken' // AuthTokens
])
.leftJoin('user_profile', 'user_profile.user_id', 'user.id')
.leftJoin('user_role', 'user_role.user_id', 'user.id')
.leftJoin('role', 'role.id', 'user_role.role_id')
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.then(users => {
users = users.filter(user => {
return user.pApp_id === appId && user.atApp_id === appId && user.atPlatform === platform;
});
return users;
});
这会产生与 SQL 查询相同的结果,但问题是我必须在 Knex 调用的 .then()
子句中过滤 returned 用户,因为我不知道如何为 Application.name
和 AuthToken.platform
添加 WHERE
条件。
问题:
谁能帮我弄清楚如何构造我的 Knex 代码的 .where()
子句,使其等同于 SQL 查询?
备注:
- 我不知道如何
console.log
Knex 生成的 SQL 查询,因此我不完全确定我当前的 Knex 代码是否会生成上面的 SQL 查询它(减去正确的WHERE
子句)。我已经检查过它实际上 return 相同的结果,通过 运行 PgAdmin 中的查询和console.log()
ingusers
returned 从Knex 功能。 - 我没有包含定义此问题中使用的表和列的
CREATE TABLE
/ Knex 迁移,因为对我来说它没有必要,而且我不想已经长问题甚至更长。但是,如果您需要查看它,请随时告诉我。我很乐意包含它。
最简单的解决方案是使用 .whereRaw()
:
示例:
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.whereRaw('User.email LIKE ?', `${your_param_here}`)
.andWhereRaw('AuthToken.platform LIKE ?', `${your_param_here}`)
要调试,您可以使用 .toSQL()
来调试您的 knex 查询 documentation。
还有,不错 cheatsheet
作为热修复解决方案,您可以使用 .raw()
并将您的 SQL 代码粘贴到那里。
关于 WHERE
条件,您可以将它们链接在 knex 查询的末尾。
像这样:
return knex('user')
.select('user.id', 'user.name', 'user.email',
'role.name AS rName'
'user_profile.id AS pId', 'user_profile.date_of_birth AS pDob',
'auth_token.id AS atId' 'auth_token.platform AS atPlatform', 'auth_token.token AS atToken'
)
.leftJoin('user_profile', 'user_profile.user_id', 'user.id')
.leftJoin('user_role', 'user_role.user_id', 'user.id')
.leftJoin('role', 'role.id', 'user_role.role_id')
.leftJoin('auth_token', 'auth_token.user_id', 'user.id')
.where('user.email', 'like', '%some@email.com%')
.andWhere('application.name', 'like' '%awesome-application%')
//...etc