sqlite3.OperationalError: unrecognized token: "{"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Jonaah
User
Beiträge: 2
Registriert: Samstag 16. März 2019, 15:15

Samstag 16. März 2019, 15:21

Code: Alles auswählen

def datenSpeicher():
    connection = sqlite3.connect("./datenSpeicher.db")
    cursor = connection.cursor()
    sql = "wahlen("\
          "wahlen FLOAT)"
    sql = "INSERT INTO wahlen VALUES(" + str(mywahlen) + ", " \
          + str(k) + ", " \
          + str(n) +")"
    cursor.execute(sql)
    connection.commit()
    connection.close()
    print("Databank 'datenSpeicher.db' with", mywahlen,"loaded!")
Ich habe diesen Code geschrieben um ein Dictionary in einer Datenbank zu Speichern. Ich habe es auch schon genauso für andere Zwecke getestet und dabei hat es funktioniert, doch bei diesem mal kommt der im Titel genannte Fehler heraus. Würde mich über Hilfe sehr freuen. Vielen dank schon einmal im Voraus :D .
__deets__
User
Beiträge: 9690
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 16. März 2019, 15:27

Benutz die parametriesierte Form von SQL execute, dann sorgt die Datenbank (bzw das Modul) selbst dafür, dass solche Probleme nicht auftreten. Und “mywahlen” sollte erstens als Argument in die Funktion kommen, nicht als magischer globaler Zustand. Und zweitens den “my”-Präfix loswerden. Oder hast du schonmal Code geshdrueben, in dem die Variablen nicht von dir waren? Warum steht das my dann nicht vor allem?
Sirius3
User
Beiträge: 14430
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 16. März 2019, 15:33

Man stückelt keine SQL-Anweisungen mit str und + zusammen, sondern nutzt Platzhalter.
Einfach ein Wörterbuch mit str in seine Repräsentation zu verwandeln ist auch nicht so gut, das ist nur für Debugzwecke gedacht. Wenn Du schon eine String-Repräsentation willst, benutze JSON.
Die Funktion bekommt mywahlen, k und n aus dem Nichts und das sind zudem sehr schlechte Namen, weil sie einbuchstabig sind und nichts aussagen.
Die Meldung zum Schluß `loaded` ist falsch, da Du ja was speicherst.

Was sind mywahlen, k und n und wie sieht die Tabelle aus?
Jonaah
User
Beiträge: 2
Registriert: Samstag 16. März 2019, 15:15

Samstag 16. März 2019, 15:56

Erstmal danke für die ganzen Antworten. Ich hätte vielleicht nennen sollen, dass das nicht der ganze code ist sonder nur ein teil davon, wo das Problem entsteht, deßhalb kommen die var nicht irgendwo her sondern aus anderen teilen des Codes. Das war mein Fehler sorry :). Ich denke der Fehler ist hauptsächlich das mywahlen ein Dictionary/ Array war und es deshalb nicht funktioniert hat. Ich werde dann warscheinlich auf json umsteigen. Vielen Dank nochmal!
Benutzeravatar
__blackjack__
User
Beiträge: 8575
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 16. März 2019, 16:07

@Jonaah: Der Fehler ist hauptsächlich das Du selbst Werte in SQL mit Zeichenkettenoperationen hinein formatieren willst. Das ist nicht nur falsch sondern auch gefährlich. Stichwort SQL-Injection.
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Antworten