【问题标题】:Using knexjs for insert ignore使用 knexjs 插入忽略
【发布时间】:2021-08-20 19:07:10
【问题描述】:

我遇到了这个问题,我想使用 knexjs 插入一组数据。但我希望插入忽略重复,即仅在数据不存在时插入。我可以这样做

knex('rates').insert(allRates);

但我想知道如果存在ignore 修饰符,我可以使用谁。我也不想做knex.raw 谢谢。

【问题讨论】:

  • 需要正确的格式
  • 为什么讨厌raw?它是 knex 的一部分是有原因的。我们可以使用 raw 将数据表示为一组以从中选择或加入吗?
  • 我也遇到了同样的问题,想用this reasoning here 是个好习惯吗?

标签: mysql sql knex.js


【解决方案1】:

Knex.js 不提供此功能。 一个潜在的解决方案是:

knex.raw(knex('rates').insert(allRates).toString().replace('insert', 'INSERT IGNORE'));

这是raw函数的最小用法,不强制你手动转换数据。

【讨论】:

    【解决方案2】:

    2021 年。现在使用 Knex 可以解决此问题。

    knex('tableName')
      .insert({
        email: "ignore@example.com",
        name: "John Doe"
      })
      .onConflict('email')
      .ignore()
    //Outputs: insert ignore into `tableName` (`email`, `name`) values ('ignore@example.com', 'John Doe')

    【讨论】:

      【解决方案3】:

      我是这样做的:

      knex_insert_ignore(knex, 'rates', allRates);
      
      // insert into `metric_names` (`a`, `b`, `c`, `d`) values (1, 2, DEFAULT, DEFAULT), (DEFAULT, DEFAULT, 3, 4)
      // INSERT IGNORE `metric_names` (`a`, `b`, `c`, `d`) values (1, 2, DEFAULT, DEFAULT), (DEFAULT, DEFAULT, 3, 4)
      function knex_insert_ignore(knex, table, rows)
      {
          if (rows.length == 0) {
              return Promise.resolve();
          }
      
          const keys = rows_keys(rows);
          const inserts = [];
          const bindings = [table, ...keys];
          for (let i = 0, end = rows.length; i < end; ++i) {
              const row = rows[i];
              const insert = [];
              for (let j = 0, jj = keys.length; j < jj; ++j) {
                  const key = keys[j];
                  if (row[key] === undefined) {
                      insert.push('DEFAULT');
                  }
                  else {
                      insert.push('?');
                      bindings.push(row[key]);
                  }
              }
              inserts.push(`(${insert})`);
          }
          return knex.raw(`INSERT IGNORE INTO ?? (${keys.slice().fill('??')}) VALUES ${inserts}`, bindings);
      }
      
      // Return all keys mentioned in rows
      function rows_keys(rows)
      {
          const unique = {};
          for (let i = 0, end = rows.length; i < end; ++i) {
              const keys = Object.keys(rows[i]);
              for (let j = 0, jj = keys.length; j < jj; ++j) {
                  unique[keys[j]] = true;
              }
          }
          return Object.keys(unique);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-13
        • 1970-01-01
        • 2016-12-04
        • 2012-09-19
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        相关资源
        最近更新 更多