【问题标题】:How to find or create with Knex?如何使用 Knex 查找或创建?
【发布时间】:2018-02-09 02:59:20
【问题描述】:

就简单的用户注册而言,如何以最佳性能通过用户名进行查找或创建?猜想我需要使用原始查询,但我还没有那么精通 sql。

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

【问题讨论】:

    标签: javascript mysql node.js knex.js


    【解决方案1】:

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

    获取用户,如果找不到插入,再次获取用户(Mysql fetch the row just inserted)。

    类似:

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

    【讨论】:

    • 是的,我很害怕这就是答案。我想将它缩小到尽可能少的查询,但是哦,好吧。那么,在引擎盖下,在像 Sequelize 或 Bookshelf 这样的 ORM 中,在它们的包装器(例如 findOrCreate)中,它本质上是否归结为这种冗长的查询类型?还是应该使用 ORM 更好地处理这些事务?
    • 是的。在引擎盖下 ORM 也没有更好的方法来做到这一点。在开发任何处理相关数据的复杂软件时,通常最好使用某种 ORM。否则,您最终只会自己编写类似的抽象。我们在 vincitvincit.github.io/objection.js 中使用(和开发)的那个,它建立在 knex 之上,并且具有大量额外的功能,可以在处理关系和获取/插入嵌套数据时让生活更轻松。希望我们也会在某个时候添加对 mysql 的 json 支持(该功能目前仅限于 postgres)。
    【解决方案2】:

    我整天都在处理这个问题。不确定此解决方案是否适用于 Knex 支持的所有数据库。我正在使用 PostgreSQL。

    knex('users')
      .insert(
        db('users')
          .select(knex.raw('? ? ?', [
            username,
            first_name,
            last_name
          ]))
          .whereNotExists(
            knex('users').select(0).where({username})
          )
          .limit(1)
      );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 2013-12-17
      • 2013-05-26
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多