我正在尝试使用单个操作将许多不同的行插入到sqlite数据库中。每行都有多列,我将数据表示为数组数组。
我已经阅读了用户指南和其他教程,但是所有提到插入多行的内容都适用于只有一列的行。
我试图插入一个更大的数组,但是为了测试它,我将其分为两个条目。
let testArtist = [["string", 1, 2, "string"], ["string", 3, 4, "string"]];
let artistQuery = "INSERT INTO artists (artist, numSongs, numAlbums, picture) VALUES (?, ?, ?, ?), (?, ?, ?, ?)";
db.serialize(
db.run(artistQuery, [testArtist], function(err){
if(err) throw err;
});
});
这是插入操作的结果
select * from artists;
1||||
2||||
因此,将插入AUTOINCREMENT
整数ID,但不会插入数据。
答案 0 :(得分:0)
编辑:我自己弄清楚了。您需要做的是将阵列展平为单个阵列。
所以:
[["string", 1, 2, "string"], ["string", 3, 4, "string"]]
成为:
["string, 1, 2, "string", "string", 3, 4, "string"]
您仍然需要在INSERT INTO
操作中分离值,我使用了map
函数,如教程中所述。
let artistPlaceholders = artistRecords.map(() => "(?, ?, ?, ?)").join(', ');
let artistQuery = "INSERT INTO artists (artist, numSongs, numAlbums, picture) VALUES " + artistPlaceholders;
let flatArtist = [];
artistRecords.forEach((arr) => { arr.forEach((item) => { flatArtist.push(item) }) });
db.serialize(function(){
db.run(artistQuery, flatArtist, function(err){
if(err) throw err;
});
});
artistRecords
是以下形式的数组:
[["string", 0, 0, "string"], ["string", 0, 0, "string"], [...]]
如果您的数组具有多层嵌套,则需要修改展平函数。
答案 1 :(得分:0)
我想@Chris自己的答案是在单个巨型INSERT语句中完成多行和多列的唯一方法(尽管我很想听听为什么它只需要一个操作)。
我也很难在node.js中找到sqlite3的示例(这就是我到这里的结局),所以我想分享一个多列示例,该示例可以实现上述目标,但需要进行多次操作。
let testArtist = [
["string", 1, 2, "string"],
["string", 3, 4, "string"]
];
// create the statement for the insertion of just ONE record
let artistQuery =
"INSERT INTO artists (artist, numSongs, numAlbums, picture) " +
"VALUES (?, ?, ? ,?)";
// 'prepare' returns a 'statement' object which allows us to
// bind the same query to different parameters each time we run it
let statement = db.prepare(artistQuery);
// run the query over and over for each inner array
for (var i = 0; i < testArtist.length; i++) {
statement.run(testArtist[i], function (err) {
if (err) throw err;
});
}
// 'finalize' basically kills our ability to call .run(...) on the 'statement'
// object again. Optional.
statement.finalize();
// If I call statement.run( ... ) here again, I will get an error due
// to the 'finalize' call above.
如果需要确保按顺序插入所有行,则可以像@Chris一样将整个循环包装在db.serialize( ... )
中。