使用node-sqlite将数据从一个数据库复制到另一个数据库 – 格式化“插入”语句

我正在写一个小的实用程序将数据从一个sqlite数据库文件复制到另一个。 两个文件都有相同的表结构 – 这完全是关于从一个数据库移动到另一个数据库的行。

我的代码现在:

let tables: Array<string> = [ "OneTable", "AnotherTable", "DataStoredHere", "Video" ] tables.forEach((table) => { console.log(`Copying ${table} table`); sourceDB.each(`select * from ${table}`, (error, row) => { console.log(row); destDB.run(`insert into ${table} values (?)`, ...row) // this is the problem }) }) 

这里的row是一个js对象,每个表都有键控数据。 我敢肯定,有一个简单的方法来做到这一点,不涉及转义string数据。

您可以迭代该row并使用dynamic生成的参数和引用来设置查询。

 let tables: Array<string> = [ "OneTable", "AnotherTable", "DataStoredHere", "Video" ] tables.forEach((table) => { console.log(`Copying ${table} table`); sourceDB.each(`select * from ${table}`, (error, row) => { console.log(row); const keys = Object.keys(row); // ['column1', 'column2'] const columns = keys.toString(); // 'column1,column2' let parameters = {}; let values = ''; // Generate values and named parameters Object.keys(row).forEach((r) => { var key = '$' + r; // Generates '$column1,$column2' values = values.concat(',', key); // Generates { $column1: 'foo', $column2: 'bar' } parameters[key] = row[r]; }); // SQL: insert into OneTable (column1,column2) values ($column1,$column2) // Parameters: { $column1: 'foo', $column2: 'bar' } destDB.run(`insert into ${table} (${columns}) values (${values})`, parameters); }) }) 

如果你的数据库驱动没有阻塞ATTACH ,你可以简单地告诉数据库复制一切:

 ATTACH '/some/where/source.db' AS src; INSERT INTO main.MyTable SELECT * FROM src.MyTable;