Seite 1 von 1

komische bindvalue verhalten

Verfasst: Freitag 10. März 2023, 16:03
von Ernie1412
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 ?

Re: komische bindvalue verhalten

Verfasst: Freitag 10. März 2023, 16:08
von Ernie1412
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

Re: komische bindvalue verhalten

Verfasst: Freitag 10. März 2023, 21:54
von Ernie1412
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.

Re: komische bindvalue verhalten

Verfasst: Freitag 10. März 2023, 22:00
von sparrow
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.

Re: komische bindvalue verhalten

Verfasst: Freitag 10. März 2023, 22:51
von __blackjack__
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.

Re: komische bindvalue verhalten

Verfasst: Samstag 11. März 2023, 10:40
von Sirius3
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 = ?

Re: komische bindvalue verhalten

Verfasst: Sonntag 12. März 2023, 13:28
von sparrow
Und irgendwie hatten wir das Thema auch schon mehrfach.
Schade, wenn die Hinweise dann nicht angenommen werden.