Knex 错误:缺少表的 FROM 子句条目

Tyl*_*ler 6 javascript postgresql knex.js

我在关系数据库中使用 Knex.js。目前正在尝试做一个相对简单的连接,不涉及别名。

knex('tools_users')
  .select('*').from('tools_users')
  .innerJoin('users', 'users.id', 'tools_users.user_id')
  .innerJoin('tools', 'tools.id', 'tools_users.tool_id')
  .where('users.id', userId)
  .andWhere('tools.id', toolId)
  .andWhere('tools_users.current_durability', '>', 0)
  .first()
  .decrement('tools_users.current_durability', durabilityUsed)
  .then(() => {
    console.log('tool updated');
  })
  .catch((err) => {
    console.error(err);
  });
Run Code Online (Sandbox Code Playgroud)

console.error(err)会产生这个错误:error: missing FROM-clause entry for table "users"

我在网上其他地方找到的每个解决方案都表明这是别名问题。不过我没有使用任何别名。不知道还有什么可做的。我发现 github 存储库上的 knex 问题尚无定论。

Mik*_*stö 5

Knex 不支持连接数据以进行更新查询,因此您必须进行两个单独的查询...类似这些(我没有测试查询,因此可能存在拼写错误):

knex('tools_users')
  .innerJoin('users', 'users.id', 'tools_users.user_id')
  .innerJoin('tools', 'tools.id', 'tools_users.tool_id')
  .where('users.id', userId)
  .andWhere('tools.id', toolId)
  .andWhere('tools_users.current_durability', '>', 0)
  .first()
  .then((tool_user) => {
    return knex('tool_user').where('id', tool_user.id)
      .decrement('current_durability', durabilityUsed);
  })
  .then(() => {
    console.log('tool updated');
  })
  .catch((err) => {
    console.error(err);
  });
Run Code Online (Sandbox Code Playgroud)

或带有子查询的单个查询

knex('tools_users')
  .decrement('current_durability', durabilityUsed)
  .whereIn('id', (subQueryBuilder) => {
    subQueryBuilder
      .from('tools_users')
      .select('id')
      .innerJoin('users', 'users.id', 'tools_users.user_id')
      .innerJoin('tools', 'tools.id', 'tools_users.tool_id')
      .where('users.id', userId)
      .andWhere('tools.id', toolId)
      .andWhere('tools_users.current_durability', '>', 0)
      .limit(1);
  })
  .then(() => {
    console.log('tool updated');
  })
  .catch((err) => {
    console.error(err);
  });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!我最终删除了 .decrement() 可链接并得出了相同的结论。如果有人感兴趣的话,我可以发布我的想法。 (2认同)