SQLite Fehler

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
ScooB
User
Beiträge: 54
Registriert: Donnerstag 28. April 2011, 10:47

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.
ScooB
User
Beiträge: 54
Registriert: Donnerstag 28. April 2011, 10:47

@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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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)")
Antworten