Operational Error: syntax Error

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Hallo zusammen,

ich hab folgendes Problem, ich möchte aus meiner lokalen Datenbank n paar Sachen auslesen und mache das mit folgendem Befehl:

Code: Alles auswählen

self.qCursor.execute('''SELECT * FROM existingQuestions WHERE level >= ? AND level <= ? AND ID NOT IN ?''', (minlevel, maxLevel, solvedQuestions))
Erhalte dabei aber immer folgenden Fehler:
self.qCursor.execute('''SELECT * FROM existingQuestions WHERE level >= ? AND level <= ? AND ID NOT IN ?''', (minlevel, maxLevel, solvedQuestions))
sqlite3.OperationalError: near "?": syntax error

Anhand der beim Suchen gefundenen Beiträge komm ich bei dem Fehler nicht wirklich weiter... :K
Was mach ich denn falsch?

Vielen Dank schonmal für eure Hilfe!
grüße greven
BlackJack

@grevenilvec: Ich weiss nicht ob es daran liegt, aber das dritte '?' steht nicht für einen einzelnen Wert, dass kann man so nicht dort einsetzen lassen.

Die ersten beiden Bedingungen könnte man in SQL übrigens auch mit einem 'BETWEEN' ausdrücken.
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Danke für den Hinweis mit dem Between... War mir ned sicher ob sqlite das kann. :)

Und, joa, an dem Punkts wirds scheitern. Is mir doch glatt entgangen. ^^ Danke. Wie parametrisier ich das ganze denn dann, wenn ich ne Liste oder n Array hab?
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Schnellschuss :

Code: Alles auswählen

self.qCursor.execute('''SELECT * FROM existingQuestions WHERE level Between ? and ? AND ID NOT IN (?)''', (minlevel, maxLevel, solvedQuestions))
I'm not getting paid for being Mr. Nice Guy!
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Merci! :)
BlackJack

Das wird nicht funktionieren -- *ein* '?' steht auch nur für *einen* Wert. Du wirst die SQL-Anfrage dynamisch erstellen müssen, dass da für jeden Wert ein '?' durch Kommas getrennt in den Klammern steht.

Wobei ich das vom Entwurf her komisch finde, dass das offenbar nicht in der Datenbank erfasst wird, welche Fragen beantwortet sind.
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

Hmm, da hast du eigentlich recht. Danke für diesen Hinweis.
Ich denke immer gerne über zwei Ecken statt den direkten Weg zu nehmen. ^^
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

und weils so schön war gleich nochmal ne Frage zum Thema Datenbanken:

mein Code zum erstellen der Datenbank schaut so aus:

Code: Alles auswählen

 self.FILENAME = "physimon.sdb3"
        if not os.path.exists(self.FILENAME):
            self.phConnection = sqlite3.connect(self.FILENAME)
            self.phCursor = self.phConnection.cursor()
            self.qCursor = self.phConnection.cursor()
            self.tCursor = self.phConnection.cursor()
            sql = """
            CREATE TABLE existingPhysimons ( 
            ID INTEGER PRIMARY KEY,
            level INTEGER, 
            department TEXT,
            name TEXT,
            nickname TEXT,
            experience INTEGER,
            opensubmaps INTEGER
            )
            """
            self.phCursor.execute(sql)
            self.phCursor.commit()
            self.setUpLADB()
Wenn ich die Anwendung ausführe, meldet er mir immer, dass der phCursor kein Attribut commit() besitzt. Am Anfang importiere ich ganz normal sqlite3 und auch sonst hab ich das mal mit den verschiedenen Tuts vergleichen und seh den Fehler hier nicht.
Ach ja, ich arbeite mit Eclipse (Pydev 1.6 und Python 2.6)...
Vielen Dank auch hier schonmal. :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Na dann würde ich statt des Cursors mal die Connection fragen.
Das Leben ist wie ein Tennisball.
grevenilvec
User
Beiträge: 12
Registriert: Montag 13. September 2010, 17:19

oh, ok... Hatte das nur immer mir dem Cursor gelesen in den ganzen Beispielen.
Merci. :)
Antworten