Sqlite3 - 节点js在两个表中插入多行,lastID不起作用
Sqlite3 - node js insert multiple rows in two tables, lastID not working
我知道在 sqlite3
中提供了很多关于多重插入的解决方案,但我正在寻找将数据插入两个 table 和第二个 [=73= 的数据的有效方法]依赖于第一个table。这是一个 node js
应用程序。
我在 sqlite3 中有两个 tables programs
和 tests
。 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();
});
如果我用this.lastID
那returnsnull,显然是因为没有回调
现在。
如果我用sqlite3_last_insert_rowid()
那么
sqlite3_last_insert_rowid 未定义错误。
如果我使用 last_insert_rowid()
那么 last_insert_rowid() 不是
已定义。
查询:
如何在那里插入最后插入的程序 ID,目前我得到的最后一个程序 ID 为空?
编辑:
当且仅当使用回调是获取最后一个 ID 的方式或方法时,我才会保持我的代码 运行 当前不变。任何人都可以建议我如何提高插入速度。
谢谢!
sqlite3_last_insert_rowid()是CAPI的一部分。
last_insert_rowid() 是一个 SQL 函数。
如果 documentation 告诉您 lastID
在回调中有效,那么您必须使用回调。
只需将所有子 INSERT 移动到父 INSERT 的完成回调中。
(建议的代码并非旨在展示如何获取最后插入的 ID;它只是演示实际已插入的值。)
我知道在 sqlite3
中提供了很多关于多重插入的解决方案,但我正在寻找将数据插入两个 table 和第二个 [=73= 的数据的有效方法]依赖于第一个table。这是一个 node js
应用程序。
我在 sqlite3 中有两个 tables programs
和 tests
。 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();
});
如果我用
this.lastID
那returnsnull,显然是因为没有回调 现在。如果我用
sqlite3_last_insert_rowid()
那么 sqlite3_last_insert_rowid 未定义错误。如果我使用
last_insert_rowid()
那么 last_insert_rowid() 不是 已定义。
查询:
如何在那里插入最后插入的程序 ID,目前我得到的最后一个程序 ID 为空?
编辑:
当且仅当使用回调是获取最后一个 ID 的方式或方法时,我才会保持我的代码 运行 当前不变。任何人都可以建议我如何提高插入速度。
谢谢!
sqlite3_last_insert_rowid()是CAPI的一部分。 last_insert_rowid() 是一个 SQL 函数。
如果 documentation 告诉您 lastID
在回调中有效,那么您必须使用回调。
只需将所有子 INSERT 移动到父 INSERT 的完成回调中。
(建议的代码并非旨在展示如何获取最后插入的 ID;它只是演示实际已插入的值。)