我的mysql数据库中有一个表,其中有列id
和drivers_license_number
。现在drivers_license_number
列中的数据以纯文本存储,我想对其进行加密。
此表包含大约400000条记录。我已阅读有关LIMIT和OFFSET问题的信息,并尝试在我的查询中使用后行查找。
因此,首先我需要从db获取数据,然后加密正确的字段并使用此加密字段更新db。我不明白如何组织代码以将具有限制和偏移量的参数发送到db。在这种情况下我需要循环工作吗?
function getUpdatedEncryptedField(db_table_name, field_name) {
return getDataFromDb(db_table_name, field_name).then(function(result){
return encryptData(result, field_name).then(function (result){
var promises = result.map(function(item) {
var data = [item[field_name], item.id];
return updateFieldNameData(db_table_name, field_name, data);
});
return q.all(promises);
});
});
}
第一次通过之后,我将获得例如前1000条记录,以及如何继续获得另外1000行?
function getDataFromDb(db_table_name, field_name, limit, offset) {
var sql = 'SELECT ds.id, ' + field_name + ' FROM ( SELECT id FROM ' + db_table_name + 'WHERE ' + field_name +
' IS NOT NULL ORDER BY id LIMIT ' + limit + ', ' + offset + ') d JOIN ' + db_table_name + ' ds ON ds.id = d.id ORDER BY ds.id;'
return db.modio.executeSql(sql);
}
答案 0 :(得分:0)
您可以使用carring / highorder函数将数据块更新例如1000,并获取接下来的1000条记录,直到400000,如下所示:
function getUpdatedEncryptedField(db_table_name, field_name) {
var idFrom = 0;
var idTo = 1;
return function getDataFromDB(db_table_name, field_name){
idFrom = idTo;
idTo += 1000;
console.log(
id范围是$ {idFrom}-$ {idTo}`);
//调用您的数据库以获取提示
}
}
// assign high order func to updateChunks var, which is again a func
var updateChunks = getUpdatedEncryptedField('studentsDB','creditCard')
// so each time you execute updateChunks() the values idFrom & idTo are updated
// updateChunks()
// id range is 1-1001
// updateChunks()
// id range is 1001-2001
// and so on
// create a loop until you get all the table records, e.g.
// pay attention to define 'i' with let and not with var because of async loop
for(let i=0; i <= 400000/1000; i++){
// call the updateChunk func here
// at eaach itteration it will ask for the next chunk of records
updateChunks()
}
`
当然,您应该稍微更新一下mysql查询,以将Ids的范围从-扩展到问题范围之外。
希望有帮助,祝你好运。