komische bindvalue verhalten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

das muss mir mal einer Erklären. Ich hab folgende Abfrage:
Ich benutzte SQlite3 in verbindung mit PyQt5

Code: Alles auswählen

if self.db.open():              
            query = QSqlQuery(self.db) 
            query.prepare(f'SELECT ID FROM "{WEBSIDE}" WHERE {WEBSIDE}Link = ?;') 
            query.addBindValue(f"{Link}")
            query.exec()
so finde er die ID

Code: Alles auswählen

if self.db.open():              
            query = QSqlQuery(self.db) 
            query.prepare(f'SELECT ID FROM "{WEBSIDE}" WHERE {WEBSIDE}Link = ?;') 
            query.addBindValue(Link)
            query.exec()
so aber nicht, also ohne f-String in der BindValue.
wo liegt denn der Unterschied ?
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

hab die Antwort schon gefunden :)
Type(Link) <-- <class 'lxml.etree._ElementUnicodeResult'>. Daran hab ich garnicht gedacht und hänge an dem Verhalten schon 2 stunden lol
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

Anmerkung: bevor es Mecker gibt. ich hab jetzt keine f-Strings mehr drin nur str(), DB Typen sind TEXT.
chatGPT:
Verwenden von Python-Strings anstelle von f-Strings
Die Verwendung von f-Strings ist eine praktische Möglichkeit, um Variablen in Strings einzufügen. Allerdings sind f-Strings langsamer als normale Python-Strings. Du solltest also nur f-Strings verwenden, wenn du wirklich dynamische Werte einfügen musst.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Das ist zwar grundsätzlich richtig, ich wäre trotzdem allgemein vorsichtig bei dem Einsatz von chatGPT.
Ich kann den Hype und die Faszination durchaus verstehen, sehe aber auch häufig Antworten die irgendwo zwischen völlig falsch und 'geht auch besser' hängen. Manchmal, weil der Kontext fehlt, häufig ohne jeglichen Hinweis, was da wohl falsch gelaufen ist.

Wenn man Antwortne hinterher recherchieren muss, muss man sich auf fragen, ob die Recherche nicht die schon vorher der bessere Weg gewesen wäre.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und jemand der keine Ahnung hat, weiss auch gar nicht wie die Antworten einzuschätzen sind. Gerade dieses Beispiel zeigt das schön, das ChatGPT sehr gerne mal kompletten Unsinn verzapft, den Anfänger nicht sehen, und in der Regel auch nicht einfach nachvollziehen können. f-Zeichenkettenliterale ohne dynamisch eingefügten Wert sind nicht “langsamer“ sondern werden genau gleich schnell ausgeführt:

Code: Alles auswählen

In [331]: def f():
     ...:     print("hallo")
     ...:     print(f"hallo")

In [332]: dis.dis(f)
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('hallo')
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_GLOBAL              0 (print)
             10 LOAD_CONST               1 ('hallo')
             12 CALL_FUNCTION            1
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
Wie man sieht, führen beide `print()`-Aufrufe zu gleichem Bytecode.

Mit dynamisch hineinformatierten Werten sind f-Zeichenketten zur Laufzeit schneller als `str()` und ``+`` und sogar die `format()`-Methode, weil der Compiler bereits passenden Code erzeugt, während bei `format()` die Vorlage jedes mal analysiert wird um die Werte einzufügen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was bei der ganzen fString-Diskussion untergegangen ist:
Man baut keine SQL-Statements dynamisch zusammen egal mit welcher Stringformatierungsmethode.
Die Tabelle sollte Website als Feld haben.

Code: Alles auswählen

SELECT ID FROM passenderName WHERE Website =? AND Link = ?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Und irgendwie hatten wir das Thema auch schon mehrfach.
Schade, wenn die Hinweise dann nicht angenommen werden.
Antworten