使用 knex.js 和 MySQL 更新块
Chunk update using knex.js and MySQL
我正在尝试学习如何使用 knex.js,作为我学习的一部分,我想在我的数据库上进行一些迁移,我想更新我的一个专栏。
我正在尝试用块来做到这一点(我知道这不是最好的解决方案,它仅用于学习目的)。我正在使用 MySQL。
在我的数据库中,我有一个 table,其中包含“电子邮件”列,其中一些行以“.com”结尾。
我试图通过省略“.com”来更新此专栏。
在我的代码中,我 select 相关的列,并且我正在使用破折号库来分块我的所有数据。
我的分块数据如下所示:
我的数据库:(https://ibb.co/c8kKtcb)
第一块
[
RowDataPacket {id: 1, email: dan@gmail.com},
RowDataPacket {id: 2, email: john@gmail},
RowDataPacket {id: 3, email: steph@gmail},
]
第 2 块
[
RowDataPacket {id: 4, email: eric@gmail},
RowDataPacket {id: 5, email: tommy@gmail.com},
RowDataPacket {id: 6, email: bill@gmail.com},
]
第 3 块
[
RowDataPacket {id: 7, email: loe@gmail},
RowDataPacket {id: 8, email: helen@gmail.com},
RowDataPacket {id: 9, email: niky@gmail.com},
]
…
这是我的代码,我尝试进行更新,但我认为我做错了什么,因为它的列表结束 .update() 方法使用键值。我可以操纵我的数据吗?
exports.up = async knex => {
const users = await knex("usersWeb")
.select("id", "email")
.where("email", "like", "%.com");
const userChunks = _.chunk(users, 3);
let chunckNumber = 1;
for (const chunk of userChunks) {
console.log("Chunck number: ", chunckNumber);
const k = await knex("usersWeb")
.whereIn(columnId, chunk.map(item => item.id))
.update("email": ); // this line :(
}
chunckNumber++;
}
exports.down = async knex => {};
我解决了一段时间后忘记分享我的解决方案,所以这里是:
exports.up = async knex => {
const users = await knex("usersWeb")
.select("id")
.where("email", "like", "%.com");
const userChunks = _.chunk(users, 3);
let chunckNumber = 1;
for (const chunk of userChunks) {
console.log("Chunck number: ", chunckNumber);
const tupleOfAllEmailIds = "(" + chunk.map(item => `${item.id}`).join(", ") + ")";
const query = `UPDATE "usersWeb"
SET "email" = REPLACE("email", ".com", "")
WHERE id IN ${tupleOfAllEmailIds}
`;
await knex.raw(query);
}
chunckNumber++;
}
exports.down = async knex => {};
我正在尝试学习如何使用 knex.js,作为我学习的一部分,我想在我的数据库上进行一些迁移,我想更新我的一个专栏。 我正在尝试用块来做到这一点(我知道这不是最好的解决方案,它仅用于学习目的)。我正在使用 MySQL。 在我的数据库中,我有一个 table,其中包含“电子邮件”列,其中一些行以“.com”结尾。 我试图通过省略“.com”来更新此专栏。 在我的代码中,我 select 相关的列,并且我正在使用破折号库来分块我的所有数据。 我的分块数据如下所示:
我的数据库:(https://ibb.co/c8kKtcb)
第一块
[
RowDataPacket {id: 1, email: dan@gmail.com},
RowDataPacket {id: 2, email: john@gmail},
RowDataPacket {id: 3, email: steph@gmail},
]
第 2 块
[
RowDataPacket {id: 4, email: eric@gmail},
RowDataPacket {id: 5, email: tommy@gmail.com},
RowDataPacket {id: 6, email: bill@gmail.com},
]
第 3 块
[
RowDataPacket {id: 7, email: loe@gmail},
RowDataPacket {id: 8, email: helen@gmail.com},
RowDataPacket {id: 9, email: niky@gmail.com},
]
…
这是我的代码,我尝试进行更新,但我认为我做错了什么,因为它的列表结束 .update() 方法使用键值。我可以操纵我的数据吗?
exports.up = async knex => {
const users = await knex("usersWeb")
.select("id", "email")
.where("email", "like", "%.com");
const userChunks = _.chunk(users, 3);
let chunckNumber = 1;
for (const chunk of userChunks) {
console.log("Chunck number: ", chunckNumber);
const k = await knex("usersWeb")
.whereIn(columnId, chunk.map(item => item.id))
.update("email": ); // this line :(
}
chunckNumber++;
}
exports.down = async knex => {};
我解决了一段时间后忘记分享我的解决方案,所以这里是:
exports.up = async knex => {
const users = await knex("usersWeb")
.select("id")
.where("email", "like", "%.com");
const userChunks = _.chunk(users, 3);
let chunckNumber = 1;
for (const chunk of userChunks) {
console.log("Chunck number: ", chunckNumber);
const tupleOfAllEmailIds = "(" + chunk.map(item => `${item.id}`).join(", ") + ")";
const query = `UPDATE "usersWeb"
SET "email" = REPLACE("email", ".com", "")
WHERE id IN ${tupleOfAllEmailIds}
`;
await knex.raw(query);
}
chunckNumber++;
}
exports.down = async knex => {};