2017-04-05 101 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; 
相關問題