如何在 node.js 中使用 sqlite3 执行批量插入?

Posted

技术标签:

【中文标题】如何在 node.js 中使用 sqlite3 执行批量插入?【英文标题】:How can I perform a bulk insert using sqlite3 in node.js? 【发布时间】:2016-11-18 03:33:30 【问题描述】:

我需要在 sqlite3 表中插入 10 行,插入完成后,将新行的 10 个 id 传递给数组中的回调函数。

我的问题是我不知道如何使准备好的语句一次执行多个插入。我找到了这篇关于如何使用 mysql 执行此操作的帖子。

Bulk Inserts in mySQL

但这不适用于 sqlite。我的代码如下:

params = [[1,2],[3,4],[5,6],[7,8]]

stmt = db.prepare("INSERT INTO test (num1, num2) VALUES (?)");
stmt.all([params], function(err, res) 
    if(err) 
        console.log(err);
        return;
     else 
        createdIDs = []
        for (i in result) 
            createdIDs.push(result[i].id);
        
        nextFunction(createdIDs);
    
);

这给出了以下错误:

Error: SQLITE_ERROR: 1 values for 2 columns
at Error (native)

表的架构是这样的:

db.run('CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, num1 INTEGER NOT NULL, num2 INTEGER NOT NULL)')

编辑:使用 Alvaro 的解决方案,我现在收到此错误消息:

 [Error: SQLITE_CONSTRAINT: NOT NULL constraint failed: test.num1] errno: 19, code: 'SQLITE_CONSTRAINT' 

【问题讨论】:

你确定你和答案一样吗? @AlvaroJoao 是的,代码应该和其他答案一样。不同的是我使用的是 sqlite3 而不是 mysql 刚刚回答了你的问题...如果我帮助了你,请点赞并标记为正确答案 VALUES (?) 你还需要改成 VALUES (?1,?2) 请在问题中添加表格的约束? 【参考方案1】:

您必须按出现的顺序枚举值:

db.run("INSERT INTO test (num1, num2) VALUES (?1,?2)");

这就是为什么只检测到一个变量而不是预期的两个变量的原因。

参考here。

另一种方法:

// create the table
db.run('CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, num1 INTEGER NOT NULL, num2 INTEGER NOT NULL)')

var params = [[1,2],[3,4],[5,6],[7,8]];
db.serialize(function() 
    db.run("begin transaction");

    for (var i = 0; i < params.length; i++) 
        db.run("insert into data(num1, num2) values (?, ?)", params[i][0], params[i][1]);
    

    db.run("commit");
);

参考:https://gist.github.com/NelsonMinar/2db6986d5b3cda8ad167

【讨论】:

嗯。似乎仍然没有工作,但我现在有一个单独的错误。我插入的值有一个 NOT NULL 约束,当我插入时它会失败。让我觉得传入 [params] 无法正常工作。 @JohnPalmer 我几乎可以肯定代码没问题,你应该在 ?1,?2 之后打印新错误,我想我可以帮忙 是的,基于该参考链接,看起来这不是正确的解决方法。您可以单独绑定值,但不能传递包含多个插入值的数组。 我不认为这是有效的。它根本不使用准备好的语句,并且一旦插入完成,就不会一次访问所有 ID。我已经知道我可以按顺序运行插入并逐一处理 ID。但我希望能够一次将它们传递给数组中的回调函数。

以上是关于如何在 node.js 中使用 sqlite3 执行批量插入?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行 Node.js 的 Debian 上安装 sqlite3?

如何使用node js同步读取sqlite3数据库?

使用 node.js 检查数据是不是包含在 SQLite3 数据库中

使用 SQLite3 + Node.js 的最佳实践

Node.js sqlite3 IN 运算符

markdown rest-api使用node.js和sqlite3