如何使用Knex查找或创建?

时间:2017-08-31 08:19:50

标签: javascript mysql node.js knex.js

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

或者如果用户名已经存在,至少会有一些拒绝。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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