Tach!
was hab ich hier mit den promise falsch gemacht:
Ich muss dir konstatieren, dass du eine ganze Menge falsch machst. Zum einen scheint es mir, hast du die Arbeitsweise des sqlite3-Packages nicht verstanden. Wenn du dir auf der verlinkten Seite den Abschnitt Usage genau anschaust, solltest du das db.serialize() bemerken, in dem sämtliche Zugriffe eingebettet sind. Ein Blick in die Dokumentation steht da erstmal an, um aufzuklären, was es damit auf sich hat: Query serialization/parallelization.
"node-sqlite3 provides two functions to help control the execution flow of statements. The default mode is to execute statements in parallel."
Das heißt, dass dieses Paket ohne das serialize() asynchron arbeitet. Die Funktionen kommen sofort wieder zurück und nicht erst, wenn sie fertig sind. Damit hast du noch Querys offen, wenn du die nächsten abfeuerst. Es gibt Vorgänge, die sind exclusiv und können nicht parallel ausgeführt werden. Dazu klärt die SQLite-Dokumentation auf:
"But only one process can be making changes to the database at any moment in time, however."
Also muss das zweite Insert kaputtgehen, weil das erste noch im Paralleluniversum läuft.
Schlussfolgerung: Serialize-Modus einschalten. Aber auch dann musst du immer noch aufpassen. Die Funktionen arbeiten weiterhin asynchron und kehren sofort zurück, ohne dass das Statement überhaupt angefangen wurde. Nur warten die Statements im Hintergrund in einer Warteschlage auf die Ausführung. Wenn du Code ausführen möchtest, der die Beendigung des Statements voraussetzt, muss du den in den jeweiligen Callback stecken.
Und noch ein ganz wichtiger Punkt. Schau dir die Dokumentation des sqlite3-Paketes nochmal an, vor allem die Beispiele im Teil API Documentation → Database#run. Die Querys können als Prepared Statement formuliert werden. Es besteht keine Notwendigkeit, dass du mit Stringmanipulation
var statment = SQL_INSERT_MITARBEITER.replace(/\?name/g, "'" + data.name + "'");
rumhantieren musst. Das ist außerdem kaputt, so wie du das machst, weil das nicht beachtet, dass '
in den Daten vorkommen kann. Die Folge wären in dem Fall Syntaxfehler oder SQL-Injection. Und sowas merkt man natürlich erst im Produktivbetrieb, weil man in seinen Testdaten keine Hochkommas vorkommen hat.
dedlfix.