使用 knex update 调用 javascript 函数更新列值

update column values with call to javascript function using knex update

我正在使用 knex 迁移匿名化数据。我正在使用 faker 库生成随机的街道名称,这些名称将替换真实的街道名称。我需要 knex 更新语句来调用 faker.address.streetAddress() 函数,因为它会调用任何其他 mysql 函数(例如 RAND())。

我发现的解决方法的性能明显较低。

const faker = require("faker/locale/de");

exports.up = function (knex) {
  // generate a random character in the set ('A', 'B', 'C')
  return knex("Address").update(
    "street",
    knex.raw("CHAR(FLOOR( 65 + RAND( ) *3 ))")
  );
  // alternative is not very performant
  return knex("Address")
    .pluck("id")
    .then(function (ids) {
      return Promise.all(
        ids.map((id) =>
          knex("Address")
            .where({ id: id })
            .update({ street: faker.address.streetAddress() })
        )
      );
    });
};

exports.down = function (knex) {};

无法从 SQL 服务器端调用后端的 javascript 函数来生成数据。

如果你想在单个查询中使用不同的值随机化每个街道名称,你不能使用 faker(或任何其他 javascript 端库),但你需要在数据库端生成假地址(就像您对第一个 rand() 示例所做的那样)。

这可以通过创建地址生成的 SQL 过程来完成,并使用它代替 faker。通过使用一些预定义的单词列表并从中随机化名称+添加一些街道号码等,地址生成器可能很容易编写。