Seite 1 von 1

SQLite Fehler

Verfasst: Donnerstag 9. August 2012, 09:12
von ScooB
Hi,
ich bin grad am durchdrehen

ich führe einen DELETE in ne DB durch.

"DELETE FROM 'Main.PLCVar0' ORDER BY 'TimeStamp' DESC LIMIT 1"

wenn ich es mit dem Tool SQLiteSpy ausführe funktioniert es

wenn ich jetzt meinen Code ausführe

Code: Alles auswählen

db = 'database.db'
connection = sqlite3.connect(db)
cursor = connection.cursor()
cursor.execute("DELETE FROM 'Main.PLCVar0' ORDER BY 'TimeStamp' DESC LIMIT 1")
bekomme ich einen Fehler

Traceback (most recent call last):
File "C:\Dev\Client_Server\server.py", line 16, in <module>
cursor.execute("DELETE FROM 'Main.PLCVar0' ORDER BY 'TimeStamp' DESC LIMIT 1")
sqlite3.OperationalError: near "ORDER": syntax error

Ich finds merkwürding

Gruß
ScooB

Re: SQLite Fehler

Verfasst: Donnerstag 9. August 2012, 10:11
von sparrow
Hi,

das funktioniert nur wenn der SQLITE-Client mit SQLITE_ENABLE_UPDATE_DELETE_LIMIT kompiliert wurde. Da der Client für SQLITE ja eingebettet ist kann sich das also von Programm zu Programm unterscheiden, der Python-Interpreter verwendet wohl eine andere Bibliothek als das andere Programm.

Alternativer SQL-Syntax (vorausgesetzt du hast eine eindeutige ID):

Code: Alles auswählen

cursor.exeucute("DELETE FROM Main.PLCVar0 WHERE id IN (SELECT id  FROM Main.PLCVar0 ORDER BY TimeStamp DESC LIMIT 1)")
Ungetestet.

Re: SQLite Fehler

Verfasst: Montag 13. August 2012, 09:39
von ScooB
@sparrow

Danke allerdings klappt das auch nicht so wie ich das möchte.
Wenn ich deine Anweisung durchlaufen lasse dann löschte er mir beliebig viele und immer eine unterschiedliche Anzahl

Gruß
ScooB

Re: SQLite Fehler

Verfasst: Montag 13. August 2012, 11:58
von sparrow
Genau, das funktioniert nur wenn du eine eindeutige ID hast.
Du brauchst also einen Schlüssel mit dem du den Datensatz identifizieren kannst. Der kann auch aus Zeitstemepel und ID zusammengesetzt sein.
Wenn du sicher bist, dass immer nur der neueste Datensatz gelöscht werden soll, also anhand des Zeitstemepels, und das mehr als einer sein darf, wenn sie die identischen Zeitstempel tragen, ginge auch:

Code: Alles auswählen

con.execute("DELETE FROM Main.PLCVar0 WHERE TimeStamp = (SELECT TimeStamp FROM Main.PLCVar0 ORDER BY TimeStamp DESC LIMIT 1)")