SQL Schlüsselwort "LIKE" in PyQT

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

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    
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst einfach nur dein filterText das %-Zeichen enthalten lassen. Nicht das SQL-Statement, da hat das nix zu suchen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Danke, das geht :shock:
Antworten