如何使用 Knex 查找或创建?

tri*_*ibe 3 javascript mysql node.js knex.js

就简单的用户注册而言,如何通过用户名进行查找或创建以实现最佳性能?猜测我需要使用原始查询,但到目前为止我还不太精通 sql。

或者,如果用户名已经存在,至少会出现某种拒绝。

Mik*_*stö 5

使用 mysql,你可能需要 3 个查询,因为它不支持很好的通用表表达式(也许一些真正新的 mysql 实际上支持它们),也不返回插入的数据:

获取用户,如果没有找到插入,则再次获取用户(Mysql 获取刚刚插入的行)。

就像是:

  knex.transaction(trx => {
    trx('users').where('username', name).then(res => {
      if (res.length === 0) {
        return trx('users').insert({ username: name }).then(() => {
          return trx('users').where('username', name);
        });
      } else {
        return res;
      }
    });
  }).then(res => console.log(`User is: ${res[0]}`));
Run Code Online (Sandbox Code Playgroud)

  • 是的。在底层,ORM 也没有更好的方法来做到这一点。在开发任何处理相关数据的复杂软件时,通常最好使用某种 ORM。否则你最终只会自己写出类似的抽象。我们在 vincit http://vincit.github.io/objection.js/ 中使用(和开发)的它是基于 knex 构建的,并且具有大量额外功能,可以让处理关系和获取/插入时变得更轻松嵌套数据。希望我们也会在某个时候添加对 mysql 的 json 支持(该功能目前仅适用于 postgres)。 (3认同)