Вставка нескольких строк с несколькими столбцами в Node и sqlite3 - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь вставить много разных строк в базу данных 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 вставляется, а данные нет.

1 Ответ

0 голосов
/ 19 мая 2019

РЕДАКТИРОВАТЬ: Я понял это, ребята.То, что вам нужно сделать, это объединить массив в один массив.

Итак: [["string", 1, 2, "string"], ["string", 3, 4, "string"]]

Становится: ["string, 1, 2, "string", "string", 3, 4, "string"]

Вам все еще нужно разделить значения вINSERT INTO op, я использовал для этого функцию 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"], [...]]

Если у вас есть массив с несколькими уровнями вложенности, вам нужно изменить функцию выравнивания.

...