Node.js und SQLite mehrere Eintraege gleichzeitig speichern?
Ich will gerne mehrere Eintraege gleichzeittig in eine Tabelle speichern aber ich weis nicht wie ich das richtig schreibe, ich bekomme ganze zeit nur Fehlermeldungen, der einzige Code den ich jetzt habe der schreibt nur eine Reihe in die Tabelle und sieht so aus:
let sql = 'INSERT INTO users';
sql += '(eins';
sql += ', zwei';
sql += ', drei';
sql += ', vier';
sql += ', fuenf';
sql += ', sechs';
sql += ', sieben';
sql += ', acht';
sql += ', neun)';
sql += 'VALUES';
sql += "(?,?,?,?,?,?,?,?,?)";
let objectary = [];
for(let a=0; a<9; a++)
objectary[a] = a;
db.run(sql, objectary, function(err)
{
if(err)
{
res.status(200).json(err.message);
return console.error(err.message);
}
if(this.changes > 0)res.status(200).json(1);
else res.status(200).json("no changes saved");
});
Der Code speichert jetzt eine neue zeile in die sqlite tabelle, ich such aber ein Beispiel womit ich direkt zehn oder hundert user in die tabelle speichern kann mit nur ein Request, wie schreibt man das?
1 Antwort
Du müsstest dir aus deinen Daten einen Query wie diesen zusammenbauen:
INSERT INTO some_table (column1, column2, ...) VALUES
(value1, value2, ...),
(value1, value2, ...),
/* ... */;
Angenommen, du hast ein solches Array an Nutzerobjekten:
const userData = [
{ name: "John Doe", age: 19 },
{ name: "Mary Sue", age: 21 }
];
Dann könntest du dir so den Query zusammenbasteln:
const placeholders = userData.map(() => "(?, ?)").join(",");
const query = `INSERT INTO users (name, age) VALUES ${placeholders}`;
Das Array mit den konkreten Werten kann in einer separaten Funktion ermittelt werden:
function getParams(data) {
const params = [];
for (const entry of data) {
for (const key in entry) {
params.push(entry[key]);
}
}
return params;
}
Und zum Abschluss führt man den Query aus:
db.run(query, getParams(users), error => {
if (error) {
console.error(error);
throw error;
}
});
Würden die Statements voneinander abhängig sein, könnte sich alternativ auch eine Transaktion lohnen, die bei Fehlschlag eines Statements einen Rollback durchführt. Hier hat jemand sogar schon eine generische Funktion dafür gebaut.
Wenn du tatsächlich öfter Anwendungsfälle mit mehreren hundert Einträgen haben solltest, wäre es nicht schlecht, die unterschiedlichen Lösungswege bezüglich ihrer Ausführungsgeschwindigkeit zu testen / vergleichen.