Sqlite3 - 节点js在两个表中插入多行,lastID不起作用

Sqlite3 - node js insert multiple rows in two tables, lastID not working

我知道在 sqlite3 中提供了很多关于多重插入的解决方案,但我正在寻找将数据插入两个 table 和第二个 [=73= 的数据的有效方法]依赖于第一个table。这是一个 node js 应用程序。

我在 sqlite3 中有两个 tables programstests。 Table tests 包含 programs 的 ID,即一个程序可以包含多个测试。

sqlite3模块官方页面推荐的方法如下:

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');

db.serialize(function() {
  db.run("CREATE TABLE lorem (info TEXT)");

  var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
  for (var i = 0; i < 10; i++) {
      stmt.run("Ipsum " + i);
  }
  stmt.finalize();

  db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
      console.log(row.id + ": " + row.info);
  });
});

db.close();

根据我的要求,我必须在两个 table 中插入数据,所以 我正在使用以下代码:

var programData = resp.program_info; // contains complete data of programs and tests
db1.run("INSERT INTO programs (`parent_prog_id`, `prog_name`, `prog_exercises`, `prog_orgid`, `prog_createdby`, `prog_created`, `prog_modified`, `prog_status`)  VALUES (?,?,?,?,?,?,?,?)",prog.parent_program_id,prog.programName, JSON.stringify(prog), req.session.org_id, prog.created_by, prog.created_at, prog.updated_at, prog.program_status,function(err){
if(err){
       throw err;
}else{
var count           = 1;
var step2PostedData = prog;
for (i in step2PostedData.testsInfo) {
  var c = 0;

   for(j in step2PostedData.testsInfo[i]){

    var obj = Object.keys(step2PostedData.testsInfo[i])[c];

    db1.prepare("INSERT INTO `tests` ( `parent_name`,`test_name`, `test_alias`, `sequences`, `duration`, `prog_id`, `org_id`, `test_createdby`,  `test_created`, `test_modified`, `test_status`) VALUES(?,?,?,?,?,?,?,?,?,?,?)")
    .run(count, obj,
         step2PostedData.testsInfo[i][j].alias,
         step2PostedData.testsInfo[i][j].sequences,
         step2PostedData.testsInfo[i][j].duration,
         this.lastID, // using this I am getting program id
         req.session.org_id, 
         prog.created_by, 
         prog.created_at, 
         prog.updated_at,
         prog.program_status);

    c++;
    count++;
    }
}

现在,我的查询是如果我使用建议的方法,那么我没有从 programs table. 获得最后插入的程序 ID,没有回调.

例如如果我使用下面的代码;

var stmt = db1.prepare("INSERT INTO programs (`parent_prog_id`, `prog_name`, `prog_exercises`, `prog_orgid`, `prog_createdby`, `prog_created`, `prog_modified`, `prog_status`)  VALUES (?,?,?,?,?,?,?,?)";

var stmt2 = db1.prepare("INSERT INTO `tests` ( `parent_name`,`test_name`, `test_alias`, `sequences`, `duration`, `prog_id`, `org_id`, `test_createdby`, `test_created`, `test_modified`, `test_status`) VALUES(?,?,?,?,?,?,?,?,?,?,?)")

programData.forEach(function(prog){
    // Inserts data in programs table
    stmt.run(prog.parent_program_id,prog.programName, JSON.stringify(prog), req.session.org_id, prog.created_by, prog.created_at, prog.updated_at, prog.program_status);

     for (i in step2PostedData.testsInfo) {
       var c = 0;
       for(j in step2PostedData.testsInfo[i]){
         var obj = Object.keys(step2PostedData.testsInfo[i])[c];
         stmt2.run(
                   count, 
                   obj, 
                   step2PostedData.testsInfo[i][j].alias,
                   step2PostedData.testsInfo[i][j].sequences,  
                   step2PostedData.testsInfo[i][j].duration,
                   'what should be there',// How to get last program inserted ID there   
                   req.session.org_id,
                   prog.created_by, 
                   prog.created_at, 
                   prog.updated_at,
                   prog.program_status);
      } // inner for loop ends
  } // outer for loop ends
  stmt.finalize();
  stmt2.finalize();
});

查询:

如何在那里插入最后插入的程序 ID,目前我得到的最后一个程序 ID 为空?

编辑:

当且仅当使用回调是获取最后一个 ID 的方式或方法时,我才会保持我的代码 运行 当前不变。任何人都可以建议我如何提高插入速度。

谢谢!

sqlite3_last_insert_rowid()是CAPI的一部分。 last_insert_rowid() 是一个 SQL 函数。

如果 documentation 告诉您 lastID 在回调中有效,那么您必须使用回调。 只需将所有子 INSERT 移动到父 INSERT 的完成回调中。

(建议的代码并非旨在展示如何获取最后插入的 ID;它只是演示实际已插入的值。)