Seite 1 von 1

SQL Schlüsselwort "LIKE" in PyQT

Verfasst: Dienstag 18. Januar 2022, 13:37
von AFX
Ich bin gerade dabei, mich mit einer SQL-Abfrage abzuquälen, die das Schlüsselwort "LIKE" enthalten soll, komme hiermit aber nicht weiter:

"SELECT * FROM cres WHERE datum = %s AND UPPER(name) LIKE '%%s%'", ("0000-00-00 00:00", filterText.upper())

Diese Abfrage geht aber immer schief, denn ich kriege immer einen "unsupported format character"-Fehler, konnte aber der Dokumentation auch nicht entnehmen, wie man am besten dieses LIKE in den Abfragestring verwurstelt.

Im Voraus vielen herzlichen Dank für Tipps, wie ich diesen String richtig schreiben soll, ich weiß es leider nicht...

Hier die ganze Methode:

Code: Alles auswählen

def doQueryRCFILTERED(conn, filterText):
    ds = []
    cur = conn.cursor()
    cur.execute("SELECT * FROM cres WHERE datum = %s AND UPPER(name) LIKE '%%s%'", ("0000-00-00 00:00", filterText.upper())
)
    for d in cur.fetchall():
        ds.append(d)
    conn.commit()
    cur.close()

    return ds    

Re: SQL Schlüsselwort "LIKE" in PyQT

Verfasst: Dienstag 18. Januar 2022, 14:12
von __deets__
Du musst einfach nur dein filterText das %-Zeichen enthalten lassen. Nicht das SQL-Statement, da hat das nix zu suchen.

Re: SQL Schlüsselwort "LIKE" in PyQT

Verfasst: Dienstag 18. Januar 2022, 15:14
von Sirius3
Variablennamen und Funktionen schreibt man komplett klein. Sie sollten keine kryptischen Abkürzungen enthalten.
Platzhalter sind nicht normale Formatangaben. Die %-Zeichen müssen in den Parameter eingebaut werden.
Es gibt `ILIKE`. `fetchall` liefert schon eine Liste, das nochmal (händisch) in eine Liste umzuwandeln ist unnötig.
Wenn ein Datum nicht existiert sollte es in der Datenbank als NULL gespeichert sein, nicht als "0000-00-00 00:00".
´cres` ist ein schlechter Tabellenname, weil er zumindest für mich, sehr kryptisch ist.
*-SELECTS sollte man nicht verwenden, sondern die gewünschten Feldnamen explizit angeben.

Code: Alles auswählen

def do_query_rcfiltered(connection, filter_text):
    with closing(connection.cursor()) as cursor:
        name = f'%{filter_text}%'
        cursor.execute("SELECT * FROM cres WHERE datum = %s AND name ILIKE %s", ("0000-00-00 00:00", name))
        return cursor.fetchall()

Re: SQL Schlüsselwort "LIKE" in PyQT

Verfasst: Dienstag 18. Januar 2022, 15:59
von AFX
Danke, das geht :shock: