Node.js-将SQL查询转换为Knex.js

时间:2019-01-08 14:38:42

标签: sql node.js postgresql knex.js

我有一个SQL查询(Postgres),其中包含多个public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot childSnapshot: dataSnapshot.getChildren()){ tvUserInfo.setText(String.valueOf(childSnapshot.child("desc").getValue())); tvUserDesc.setText(String.valueOf(childSnapshot.child("mName").getValue())); } ,但我无法将它们转换为单个Knex.js语句。这是SQL查询:

join

这是我的Knex.js代码:

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';

这会产生与SQL查询相同的结果,但是问题是我必须在Knex调用的 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; }); 子句中过滤返回的用户,因为我不知道如何添加{{1 }} .then()WHERE的条件。

问题:

有人可以帮我弄清楚如何构造我的Knex代码的Application.name子句,使其等同于SQL查询吗?

注释:

  • 我不知道如何AuthToken.platform来Knex生成的SQL查询,因此我不能完全确定我当前的Knex代码会在它上面生成SQL查询(减去正确的.where()条款)。我已经检查了它是否确实返回了相同的结果,方法是在PgAdmin中运行查询,然后console.log设置从Knex函数返回的WHERE
  • 我没有包含定义此问题中使用的表和列的console.log() / Knex迁移,因为对我而言,这没有必要,并且我不想提出一个已经很长时间的问题甚至更长。但是,如果您需要查看它,请不要犹豫,让我知道。我会很乐意包含它。

2 个答案:

答案 0 :(得分:3)

要进行调试,您可以使用.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

答案 1 :(得分:1)

最简单的解决方案是使用.whereRaw()

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}`)