Python-Problem lässt sich nicht lösen

  • Hallo zusammen,

    ich habe bei meinem Python3-Programm einen Fehler, den ich nicht lösen kann - auch alle Versuche mit Chatgpt helfen nicht.

    Ich habe mir eine MariaDB10-Installation auf meiner Synology-NAS gemacht. Hier gibt es ein Datenfeld "km", in das ich mir die Entfernung in km abspeichere.

    Das Datenfeld ist in MariaDB als INT4 (also ein 4-stelliges Integerfeld) mit NULL = Nein und STANDARD = 0 definiert.

    Wenn ich einen bereits bestehenden Datensatz bearbeite, erscheint der Fehler nicht, nur wenn ich einen neuen Datensatz anfüge, das Feld km also noch "unbenutzt" ist.

    Ich hole die Daten aus dem Eingabefeld mit: km = km_var.get()

    und speichere dann mit:

    # Neuer Eintrag
    query = "INSERT INTO Funker (Ort, km, Kanal, Antenne, Relais, Realname, Skipname, Kommentar) \
    VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
           
    cursor.execute(query, (ort, km, kanal, antenne, relais, realname, skipname, kommentar))


    Hierbeit erhalte ich dann folgende Fehlermeldung:

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "/usr/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
    File "/media/wolfgang/temps/home/Programmierungen/Python/Funk/Funkerliste/funkerliste10.py", line 219, in create_new
    cursor.execute(query, (ort, km, kanal, antenne, relais, realname, skipname, kommentar))
    File "/home/wolfgang/.local/lib/python3.10/site-packages/mysql/connector/cursor_cext.py", line 345, in execute
    prepared = self._connection.prepare_for_mysql(params)
    File "/home/wolfgang/.local/lib/python3.10/site-packages/mysql/connector/connection_cext.py", line 878, in prepare_for_mysql
    result = self._cmysql.convert_to_mysql(*params)
    _mysql_connector.MySQLInterfaceError: Python type builtin_function_or_method cannot be converted

    Die fehlerhafte Zeile 219 ist die mit cursor.execute(


    Wer kann mir sagen, was ich hier falsch mache ?

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

  • 1. Ist "NOT NULL" denn zwingend?

    2. Ist neben km auch ein anderes Feld als Zahl definiert (z.B. Kanal) und macht hier keine Probleme?

    3. unterscheiden sich Update und Insert sonst noch irgendwo syntaktisch?

    Es gibt im Netz Hinweise auf Probleme mit dem geänderten default des strict mode in der MariaDB ab Version 10.2.4

  • Hallo und vielen Dank für Eure Hilfen. Ich arbeite das hier jetzt mal der Reihe nach ab:

    - "print(type(km))" ergab diese Ausgabe: <class 'str'>

    - Ein- und Ausgabe erfolgt über ein GUI

    - NOT NULL ist nicht zwingend, hatte vorher auf NULL, aber es kam dennoch immer der gleiche Fehler, also habe ich es dann so versucht, dass immer eine Zahl im Feld steht, das das Feld ja ein Integerfeld ist.

    - neben km ist noch das Feld ID ein Integerfeld (auto_increment), das keine Probleme macht.

    Unterschiede zwischen INSERT und UPDATE erkenne ich so eigentlich nicht. Ich denke der Unterschied liegt darin, dass bei INSERT ein zunächst leerer Datensatz angelegt wird und der Satzzeiger bei UPDATE bereits auf einem Datensatz steht.

    Was ist denn der strict mode ?

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

  • Hier ist die Tabellenstruktur von der Tabelle "Funker":

    Allerdings habe ich in meinen Anfängen auch folgendes gemacht (ich wollte damit eine Relation zwischen den beiden Tabellen "Funker" und "Entfernungen" herstellen.

    Nun zweifle ich gerade an dieser Option ...

    Images

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

  • Nun das wundert mich jetzt auch, dass "str" ausgeworfen wird - eigentlich sollten das ja Zahlen sein


    Ich denke mal, dass das an dem Feld "Ort_key" liegen könnte, das ja durch den Constraint mit dem Feld ID aus der <tabelle "Entfernungen" korrespondiert. Sollte ich den Constraint und das Feld Ort_Key löschen, ich denke, dass ich mich da zu Anfangs etwas verrannt haben könnte. Für meine Zwecke brauche ich (glaube ich jetzt) gar keine Relation zwischen den Tabellen zu bilden, das kann SQL ja so schon.


    Ich habe nur nach Auslesen des Datenfeldes "km" diese Konvertierungsfunktion gemacht und nun erhalte ich als Ergebnis:

    0
    <class 'int'>

    # Konvertierung:
    km = km.strip() # Entferne unnötige Leerzeichen
    if not km.isdigit():
    km = 0 # Setze Standardwert 0, falls km leer ist oder ungültige Zeichen enthält
    else:
    km = int(km)
            
    print(km)
    print(type(km))


    Da auch jetzt noch der gleiche Fehler kommt, habe ich mal diesen Constraint und das Feld "Ort_key" gelöscht.

    Aber auch hier ist das Ergebnis das noch gleiche. Hm

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

    Edited once, last by DenalB: 3 Beiträge von PapaWolf mit diesem Beitrag zusammengefügt. (January 29, 2025 at 1:58 PM).

  • Was ist denn der strict mode ?

    Guck dir das mal genauer an. Vielleicht nicht ganz genau dein Topic treffend, aber ggf. ein weiterer Hinweis, allerdings würde er bedeuten, daß km aus irgendeinem Grund bei INSERT evtl. doch als NULL in der DB ankommt.

    NULL Values
    NULL represents an unknown value.
    mariadb.com
  • Danke - werde ich mir ansehen

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

  • So, nun habe ich das Problem vielleicht nicht gelöst, aber aus der Welt geschafft. Habe nun die Speicher-Routine ausgelagert, auf einen eigenen Button gelegt und jetzt funktioniert das, ohne dass ich noch irgendwas konvertiert hätte - seltsam, funktioniert aber so.

    Dennoch danke für Eure Tipps - hier lernt man immer was dazu.

    Unsere Systeme:

    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 16GB, Nvidia Gforce GTX 1650
    1 x Mint 21.3 Cinnamon im Dualboot mit Windows 7 auf Intel I7 32 GB, Nvidia Gforce GTX 660 TI
    1 x Mint 22.0 Cinnamon auf Intel I7 16GB, NVidia Gforce GT710 (Testrechner)
    1 x Mint 22.1 Cinnamon auf AMD 5 5600 32GB, AMD Radeon RX 6600 8GB (gekauft hier bei "nicoletta")
    1 x Mint 21.3 Cinnamon Dualboot mit Windows 7 auf Intel I7 16GB Nvidia Gforce GT640M (im Notebook)

  • Die Fehlrmeldung selbst deutet darauf hin das entweder (ort, km, kanal, antenne, relais, realname, skipname, kommentar) evt. auch Namen von Funktionen sein könnten, oder der Datentyp eines Wertes nicht stimmt.

    #FurZiPuPS

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!