Kann nur ein Zeichen an die DB übergeben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Moin,
ich verzweifle langsam an meiner Datenbankabfrage. Ich habe hier Folgendes:

Code: Alles auswählen

def searchByWord():
    search = w.lineEditSearch.text()
    if search != "":
        print(search)
        conn = sqlite3.connect('base.db')
        c = conn.cursor()
        for row in c.execute('SELECT * FROM woeoerbook WHERE platt = ? OR deutsch = ?;', [search, search]):
            print(row[1] + " " + row[2] + " " + row[3])

        conn.commit()
        conn.close()
Wenn ich einen Buchstaben eingebe, geht die Abfrage. Wenn ich zwei oder mehr Zeichen eingebe, schmiert Python ab. Ich komme einfach nicht dahinter, woran es liegt. :K Weiß jemand, was ich machen kann?
Zuletzt geändert von Anonymous am Sonntag 21. Mai 2017, 22:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@PierreDole: Python schmiert nicht nur einfach ab, sondern gibt eine Fehlermeldung inklusive Traceback aus. Diese Meldung zu kennen, wäre sehr hilfreich. Dass execute von sqlite3 ein cursor-Objekt zurückliefert, ist nicht der Standard. Um also andere APIs einfacher zu nutzen, solltest Du darauf nicht vertrauen, zumal Du ja mit c schon das cursor-Objekt hast. commit ist hier überflüssig, da SELECT nichts an der Datenbank ändert.

Was sind denn die Spalten der Tabelle? Und heißt die wirklich woeoerbook?
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Hmm, eigentlich habe keine Fehlermeldung. Aber wo du es erwähnt, fällt mir auf, daß da eben diese fehlt. Ich benutze PyCharm als Oberfläche und die Konsole zeigt mir nur dies hier an:
F:\workspace\_tools\pyton\Python36-64\python.exe F:/workspace/python/mienPlatt/mienPlatt.py
f
fd

Process finished with exit code 255
"f" war die erste Eingabe, die ging. Und dann folge die Zweite und das Abschmieren. Daß Python abschmiert sehe ich an dem Windows-Standarddialog "Programm X funktioniert nicht mehr".

Ja, die Tabelle heißt wirklich woeoerbook (Wöörbook ist Plattdüütsch und bedeutet Wörterbuch) und besteht aus den Spalten id, platt, dueuetsch, woortaart.

Und das mit dem Cursor... naja, ich kenne SQL nur in Verbindung mit php und habe diesen Teil des Codes aus einem Beispiel übernommen. Oder um es direkt zu sagen: ich habe keine Ahnung, was der Cursor konkret macht. :)
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Ich konnte den Fehler eingrenzen und sogar einen Weg gefunden, bei dem kein Fehler kommt. Habe gleich auch den Code minimal verändert.

Code: Alles auswählen

def searchByWord():
    search = w.lineEditSearch.text()
    if search != "":
        print(search)
        connect = sqlite3.connect('base.db')
        cursor = connect.cursor()
        for row in cursor.execute('SELECT * FROM woeoerbook WHERE platt LIKE ? OR deutsch LIKE ?;', [search, search]):
            print(row[1] + row[2]) # kein fehler
            #print(row[1] + row[2] + row[3]) #fehler
            #print (row[1] + " " + row[2]) #fehler
            #print (row[1] + " " + row[2] + " " + row[3]) #fehler

        #connect.commit()
        cursor.close()
        connect.close()
Es lag an der print-Ausgabe, auch wenn ich die SQL-Anweisung geändert habe. Mit der alten hat es sich genauso verhalten. Echt keine Ahnung, was da schiefläuft.
Wenn ich mir nur row ausgeben lassen, kommt dies:
(0, 'ik', 'ich', 1)
Ich kann mehr als ein Zeichen übergeben und die Suche geht. Es kommen auch alle vier Spalten an. Kann es etwas damit zu tun haben, daß die vierte Spalte ein Integer ist?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@PierreDole: + kann zwei Zahlen addieren oder zwei Strings zusammenfügen, aber was soll die Addition einer Zahl mit einem String sein? Das Programm sollte aber bei solch einem Fehler mit einer Fehlermeldung abbrechen und nicht einfach nicht mehr reagieren. Du scheinst also an anderer Stelle noch etwas nicht so zu machen, wie es üblich ist.

Zum Problem: Schau Dir Stringformatierung an.
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Alles klar, danke. Damit habe ich jetzt bei einer Script-Sprache nicht gerechnet. Lua war das immer egal. :)

Was die Fehlermeldungen angeht, ich habe jetzt Spyder installiert und damit bekomme ich endlich Feedback.
BlackJack

@PierreDole: Erwarte bei Python besser eine Programmiersprache und keine „Skriptsprache“, was immer das auch sein soll. Unerwartete implizite Typkonvertierungen machen moderne Sprache normalerweise nicht mehr. Da ist man bei älteren wohl zu oft mit auf die Nase gefallen.
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Ja, ich merke das immer mehr beim Einlesen in die verschiedenen Teile von Python, daß es mehr drauf hat, als ich dachte.
Antworten