2017-04-05 92 views
1

我正在编写一个小型实用程序,用于将数据从一个sqlite数据库文件复制到另一个。两个文件都有相同的表结构 - 这完全是关于将行从一个数据库移动到另一个数据库。使用node-sqlite将数据从一个数据库复制到另一个数据库 - 格式化'insert'语句

我现在代码:

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对象,从每个表中的所有键数据。我确信有一个简单的方法可以做到这一点,不涉及转义字符串数据。

回答

1

您可以使用动态生成的参数和引用遍历rowsetup查询。

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); 
    }) 
}) 
1

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

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