node.js - 使用 NodeJS 将大表从流式传输到另一个表
问题描述
我正在尝试从一张桌子复制到另一张桌子。所以我想将大数据流式传输,当它进来时,我想将该数据的内容复制到另一个表中。它不仅仅是一个直接的副本。我可能会稍微整理一下数据,然后将其复制到新表中。我遇到的问题是行事件不断触发,我无法控制它。我尝试在我希望让它停止但似乎没有工作的地方使用 async 和 await 。我无法控制事件是否触发。这就是我到目前为止所拥有的。所以基本上我想在 MSSQL 中模拟一个游标。我不想下载所有数据然后对其进行操作。
我没有显示下面的数据按摩,因为我只是想看看我是否可以将数据从一个表复制到另一个表。
var fs = require('fs');
var sql = require('mssql');
var sql2 = require('mssql');
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES;
var SqlString = require('sqlstring');
const config = {
user: 'xxxx',
password: 'xxx',
server: 'xxxx\\',
port: 'xxxx',
database: 'xxxx',
options: {
instanceName: 'sql2014'
}
};
function insertRecord(pool, record){
return new Promise(function(resolve, reject){
const request = pool.request();
request.input('invoice_id', sql.Int, record.invoice_id);
request.query('INSERT INTO _invoice_temp(invoice_id) VALUES(@invoice_id)', (err, result) => {
if(err){
reject(err);
}
resolve(1);
});
});
}
async function main() {
try
{
let pool = (await sql.connect(config));
const request = pool.request();
request.stream = true;
request.query('select * from invoice');
var data = await request.on('row', row => {
return new Promise(function(resolve, reject){
resolve(row);
});
});
await insertRecord(pool, data);
}
catch(err){
console.log(err);
}
};
main();
解决方案
如果您想将表从同一个数据库复制到另一个表,那么您应该只在 db 级别下完成它。从数据库中获取数据,然后通过一些服务器端技术(如 Node.js)处理并将其插入到该数据库中,这不是一个好方法。因此,您可以使用原始 SQL 查询来完成您的工作。
将一个表的所有列复制到另一个表:
INSERT INTO table2
SELECT * FROM table1
WHERE condition;
仅将一个表中的一些列复制到另一个表中:
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;
您可以在以下链接中了解更多信息: https ://www.w3schools.com/sql/sql_insert_into_select.asp
推荐阅读
- c# - 在 C# 中引用主对象变量
- mongodb - 一个对象包含两个数组。我如何匹配所有数组中的 id?
- asp.net-mvc - Azure 应用程序配置服务在 MVC 应用程序 .NET Core 3.x 中显示更改而不刷新页面
- python - 'KeyError:' 迭代 pandas 数据帧时
- amazon-web-services - AWS - 文件已被系统删除
- node.js - 如何正确配置 Next.js 作为前端和 Express 应用作为后端?
- mongodb - 优化 mongo 查询 - _id 或遍历整个集合
- java - 通过 selenium Webdriver 自动登录而不提供密码
- javascript - 以 @ 开头的导入在 Jest 中不起作用
- node.js - 使用 node.js 连接到可用的 SMTP 服务器