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



我使用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端库),但你需要在DB端生成伪地址(就像你使用first rand()示例一样)。

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