2012-04-05 2 views
4

Ich versuche, eine Zeile in SQLite db mit nodejs und node-sqlite3-Paket zu löschen.Nodejs node-sqlite3 rufe Rückruf funktioniert nicht

Wenn ich den Löschbefehl ausführen und manuell die Einträge überprüfen, kann ich sehen, dass die Abfrage diese Zeile erfolgreich gelöscht hat, aber ich kann nicht scheinen, den Code zu schreiben, der dies bestätigt.

Dies ist die Abfrage

db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) { 
console.log(error); 
}); 

Unabhängig von einem falschen oder rechten Eingang, gibt es null an die Konsole. Wenn die richtigen Details angegeben werden, löscht es es und gibt null aus, wenn falsche ID und Benutzer angegeben werden, druckt es weiterhin Null.

Irgendwelche Ideen, was könnte falsch sein?

Dank

+1

Ich glaube nicht, irgendetwas nicht stimmt.Sie erhalten nur einen Fehler, wenn die Abfrage fehlschlägt (mysql lehnt dies ab), was nicht der Fall wäre, wenn die gebundenen Parameter nur Null oder nicht definiert wären. Die wirkliche Gefahr ist, dass es versucht, das Falsche zu löschen. –

Antwort

4

gibt nichts in den Knoten und Knoten-sqlite3 Verhalten ist hier falsch. Hier sind zwei Teile zu erklären, zuerst in Bezug auf Knoten und andere in Bezug auf Sqlite.

Node

Ihr Rückruf wird nach der Ausführung der Anweisung aufgerufen zu werden. Also nichts falsch hier, da Ihr Callback aufgerufen wird (wie durch 'Null' als Ausgabe bewiesen).

Sqlite

Löschabfrage in Sqlite löscht, wenn in where Klausel gegebene Bedingung true, sonst nichts gelöscht wird.

Bezug von node-sqlite3 documentation's Database#run api:

Rückruf (optional): Wenn angegeben, wird es aufgerufen werden, wenn ein Fehler bei jedem Schritt der Anweisung Vorbereitung oder Ausführung auftritt, und nach wurde die Abfrage ausführen. Wenn ein Fehler aufgetreten ist, wird der erste (und einzige) Parameter ein Fehlerobjekt sein, das die Fehlermeldung enthält. Wenn die Ausführung erfolgreich war, ist der erste Parameter null.

also in Ihrem Fall Abfrage gelingt Ausführung ohne Fehler, in error Argumente resultierende Funktion Rückruf null, wie Sie in der Ausgabe zu sehen.

Wenn Sie darüber hinaus tatsächlich entfernt werden, wenn jede Zeile überprüfen möchten, können Sie changes Eigenschaft verwenden, wie in der Dokumentation erwähnt:

Wenn die Ausführung erfolgreich war, es enthält zwei Eigenschaften mit dem Namen „lastID“ und "changes" enthält den Wert der zuletzt eingefügten Zeilen-ID und die Anzahl der von dieser Abfrage betroffenen Zeilen. Beachten Sie, dass "lastID" nur gültige Informationen enthält, wenn die Abfrage eine erfolgreich abgeschlossen INSERT-Anweisung war und "Änderungen" nur gültige Informationen enthält, wenn die Abfrage erfolgreich UPDATE oder DELETE-Anweisung abgeschlossen wurde.In allen anderen Fällen ist der Inhalt dieser Eigenschaften ungenau und sollte nicht verwendet werden. Die Funktion .run() ist die einzige Abfrage-Methode, die diese zwei Werte festlegt; Alle anderen Abfragen Methoden wie .all() oder .get() rufen diese Werte nicht ab.

Hoffe, es hilft ...

+0

vielen Dank. rettete meinen Tag – Kingalione

1

ich ähnliches Problem hatte, Rückrufe wäre einfach nicht schießen. Zeitraum. Das Problem war, dass ich an anderer Stelle process.exit (1) anrief, also war mein Code beendet, bevor die Callbacks eine Chance hatten, zurückzukehren.

Suche nach process.exit, die (oder auch nicht) können Sie Stunden Debugging und die Schuld SQLite speichern :)

Aus dem Thema: Was Bugs mein Geist ist, warum sie All-Cap-ID in lastID. Es ist nicht wie eine Abkürzung wie SQL oder USA. Es steht für Identifikation, das ist ein Wort.

1

Ich habe ein Problem mit Nodejs 4.3 und sqlite3: 3.1.1.

Das Problem ist, dass ich trennen möchte, wenn das Update auf eine Zeile wirkt, wenn das Update keine Auswirkungen auf keine Zeile hat (ohne zuerst die Auswahl zu treffen).

In meinem Beispiel habe ich eine Zeile mit einer ID = 1. Ich würde gerne wissen, dass, wenn ich ein Update mit einer ID = 1111 mache, keine Zeile betroffen war.

Ich habe den Rückruf auf database.run verwendet, aber es scheint nicht Valorizing Wert von this.changes wenn Update in einer Zeile in der Datenbank ausgeführt wird.

var sql = 'update recipes set stars = stars + 1 where id = ?'; 

db.run(sql, 
    [ 
    1 // id = 1 execute update - if id = 11111 do nothing 
    ], (err) => { 
     if(err) 
      throw err; 

     console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); 

     if(this.changes == 1) 
      console.log("WORK DONE"); 
     else 
      console.log("NOTHING DONE"); 

    }); 

this.changes ist nicht definiert, auch wenn Update korrekt ausgeführt wird (das gleiche, wenn ich eine ID verwenden, zum Beispiel 1.111.111, nicht in der db).

Es ist ein Fehler oder ich habe nicht verstanden, wie Callback verwenden?

Ergebnis auf der Konsole ist: -Value-Änderungen: undefined - {db: Datenbank {open: true, Dateiname: './dindin.sqlite', Modus: 65542}}

das gleiche, wenn id = 1 und führe das Update auf einer Zeile oder ID = 1111111 aus und führe das Update auf keiner Zeile aus.

1

Zu meiner prevoius Frage war das Problem, dass ich fetten Pfeil für Rückrufdeklaration verwendet habe. Von Javascript-Dokumentation habe ich entdeckt, dass in Pfeil Funktion (Fett Pfeil), diesesagte lexikalischen Umfang und so dieses Ergebnis nicht definiert und nicht bewertet, wie in der Bibliothek Dokumentation hat. Unter Verwendung einer ansonsten anonymen Funktion ist dies in dynamischen Bereich und so begrenzt this.changes ist bewertet.

mit Code nun wie unten ist ok:

var sql = 'update recipes set stars = stars + 1 where id = ?'; 

db.run(sql, 
    [ 
    1 // id = 1 execute update - if id = 11111 do nothing 
    ], function(err) { 
     if(err) 
      throw err; 

     console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null })); 

     if(this.changes == 1) 
      console.log("WORK DONE"); 
     else 
      console.log("NOTHING DONE"); 

    }); 

hier weitere Erklärungen: https://github.com/mapbox/node-sqlite3/issues/606