const query = (sql, values) => {
return new Promise((resolve, reject) => {
if (isMySQL) {
pool.getConnection((err, connection) => {
if (err) {
writeFileLog(err);
reject(err);
return;
}
connection.query(sql, values, (err, results) => {
connection.release();
if (err) {
console.log(err);
writeFileLog(err);
reject(err);
} else {
resolve(results);
}
});
});
} else {
const trimmedSql = sql.trim(); // 去除开头和结尾的空格
if (trimmedSql.toLowerCase().startsWith('select')) { // 处理 select 查询
connection.all(trimmedSql, values, (err, rows) => {
if (err) {
writeFileLog(err);
reject(err);
} else {
resolve(rows);
}
});
} else {
// 检查是否是批量插入
if (trimmedSql.toLowerCase().startsWith('insert') && Array.isArray(values) && Array.isArray(values[0])) {
// 将二维数组转换为字符串形式的占位符和值
// const placeholders = values.map(
// () => `(${new Array(values[0][0].length).fill('?').join(', ')})`
// ).join(', ');
// const flattenedValues = values.flat();
// // 替换 SQL 语句中的占位符
// const batchSql = trimmedSql.replace('?', placeholders);
// let promises = flattenedValues.map(value => {
// return new Promise((resolve, reject) => {
// connection.run(batchSql, value, function (err) {
// if (err) {
// writeFileLog(err);
// reject(err);
// } else {
// resolve(this.changes); // 返回受影响的行数
// }
// });
// });
// });
// Promise.all(promises)
// .then(results => resolve(results))
// .catch(err => reject(err));
//上面注释的是逐条插入,效率慢,改成构建insert into table (id,name) values (?,?),(?,?)...这样的sql进行批量插入
// const dataArray = values[0]; // `values` 是二维数组,取第一维度
// const numFields = dataArray[0].length;
// const placeholders = new Array(dataArray.length).fill(`(${new Array(numFields).fill('?').join(', ')})`).join(', ');
// // 生成完整的 SQL 语句
// const batchSql = trimmedSql.replace('?', placeholders);
// // 展平值数组
// const flattenedValues = dataArray.flat();
// connection.run(batchSql, flattenedValues, function (err) {
// if (err) {
// writeFileLog(err);
// reject(err);
// } else {
// resolve(this.changes); // 返回受影响的行数
// }
// });
//避免SQLITE_ERROR: too many SQL variables,进行批量插入
const dataArray = values[0]; // `values` 是二维数组,取第一维度
const numFields = dataArray[0].length;
const batchSize = 2000; // 每次批量插入的记录数
let currentBatchStart = 0;
const totalRecords = dataArray.length;
function insertBatch() {
if (currentBatchStart >= totalRecords) {
resolve(); // 插入完成,返回
return;
}
// 获取当前批次的数据
const currentBatch = dataArray.slice(currentBatchStart, currentBatchStart + batchSize);
const placeholders = new Array(currentBatch.length).fill(`(${new Array(numFields).fill('?').join(', ')})`).join(', ');
// 构建批量插入的 SQL 语句
const batchSql = trimmedSql.replace('?', placeholders);
// 展平当前批次的值
const flattenedValues = currentBatch.flat();
// 执行批量插入
connection.run(batchSql, flattenedValues, function (err) {
if (err) {
writeFileLog(err);
reject(err);
} else {
currentBatchStart += batchSize;
insertBatch(); // 插入下一个批次
}
});
}
// 开始分批插入
insertBatch();
} else {
connection.run(trimmedSql, values, function(err) {
if (err) {
writeFileLog(err);
reject(err);
} else {
resolve(this.changes); // 返回受影响的行数
}
});
}
}
}
});
};
03-17
3546
