SQL Eintrag zum Teil nicht und andere schon

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
UweDitzel
User
Beiträge: 4
Registriert: Dienstag 12. September 2023, 09:04

Hallo zusammen

Code: Alles auswählen

...
            with closing(mydb.cursor()) as cursor:
                cursor.execute("SELECT * FROM Stand where Wand = %s", [SE])
                result = cursor.fetchone()
                if result is not None:
                    cursor.execute("SELECT * FROM Stand where Wand = %s", [SE])
                    result = cursor.fetchall()
                    for row in result:
                        if row[6] == "r":
                            print(row[6])
                        elif row[6] == "v"
                            cursor.execute("INSERT INTO Stand (Wand, Boden, Decke, Schrank, Stuhl) VALUES (%s, %s, %s, %s, %s)", [ xDu01, xDu02, xDu03, xDu04, xDu05 ])
                            mydb.commit()
                        else:
                            print("In DB ohne Zuordnung")
                else:
                    cursor.execute("INSERT INTO Bude (Bu01, Bu02) VALUES (%s, %s)", [ xBu01, xBu02 ])
                    mydb.commit()
                    print("In DB Eingetragen")
...                    
Habe hier ein Auszug aus meinen script:
Es lappt alles soweit bis auf nach dem letzen "else:", code wo darin noch steht wird auch ausgeführt, z.b. "print("In DB Eingetragen")"
nur der SQL Befehl nicht und ich weiß nicht warum und wieso nicht, habe auf abstände geachtet ( 4 leerstellen )
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Der ganze Code ist unverständlich, und zudem nicht ausreichend um das Problem nachvollziehen zu können.
Variablennamen sollten aussagekräftig sein. Ein X ein du und eine Nummer sind das nicht.
Du hast zweimal den selben SELECT. Ein davon nur ob im nächsten Aufruf auch Werte zurückkommen. Was soll das* - select benutzt man nicht. Auch keine magischen Indexwerte. Am einfachsten entpackt man eine Reihe in der vorschleife gleich in sinnvoll benannte Variablen. Ein unverständliches V oder R in einer siebten Spalte ( wobei du nur fünf Werte in die Tabelle einträgst) sorgt dafür dass in dieselbe Tabelle weitere Einträge geschrieben werden. Sollte gar kein Eintrag in der Tabelle sein wird etwas ganz anderes in eine völlig andere Tabelle eingetragen. Es fällt mir wirklich schwer in diesem ganzen Code irgendetwas zu verstehen.
Bitte poste hier verständlichen Code, der ausreicht um das Problem nachvollziehen zu können. Dann können wir dir bestimmt helfen.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@UweDitzel: Da fehlt ein Doppelpunkt damit das am Compiler vorbei kommt.

Da von den Datensätzen die am Anfang gelesen werden eh nur das Element an Index 6 verwendet wird, sollte man auch nur *das* von der Datenbank abfragen.

Das erst ein Element abfragen um dann alle abzufragen falls es mindestens eines gibt, umständlich ist, wurde ja bereits gesagt. Da wird ja beide male die volle Abfrage gemacht von der Datenbank. Die weiss ja nicht das beim ersten mal nur ein Element abgefragt wird.

Das sähe also eher so aus:

Code: Alles auswählen

            with closing(mydb.cursor()) as cursor:
                cursor.execute(
                    "SELECT name_von_element_6 FROM stand where wand = %s",
                    [SE],
                )
                result = cursor.fetchall()
                if result:
                    for (element_6,) in result:
                        if element_6 == "r":
                            print(element_6)
                        elif element_6 == "v":
                            cursor.execute(
                                "INSERT INTO stand (wand, boden, decke, schrank, stuhl)"
                                " VALUES (%s, %s, %s, %s, %s)",
                                [xDu01, xDu02, xDu03, xDu04, xDu05],
                            )
                            mydb.commit()
                        else:
                            print("In DB ohne Zuordnung")
                else:
                    cursor.execute(
                        "INSERT INTO bude (bu01, bu02) VALUES (%s, %s)",
                        [xBu01, xBu02],
                    )
                    mydb.commit()
                    print("In DB Eingetragen")
Wenn das ``print("In DB Eingetragen")`` ausgeführt wird, dann wurde auch das INSERT und das `commit()` davor ausgeführt.

Woran machst Du fest, dass das INSERT nicht ausgeführt wurde? Anzahl der Datensätze vor und nach dem Ausführen? Oder suchst Du nach den Werten die eingetragen wurden? Bist Du an der Stelle dann sicher, dass Du nach den richtigen Werten suchst? Also das Deine Erwartung mit dem was `xBu01` und `xBu02` enthalten mit den tatsächlichen Werten übereinstimmt?

Wie sieht der Unit-Test aus der diesen Fall hier prüft? 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
UweDitzel
User
Beiträge: 4
Registriert: Dienstag 12. September 2023, 09:04

Habe den Fehler gefunden,
ich hatte ein falsches zeichen was mir nicht aufgefallen, erst nach dem Bildschirm putzen
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Da mit den eigentlichen Einträgen in `stand` gar nichts gemacht wird, sondern nur die Anzahl der verschiedenen name_von_element_6 relevant ist, sollte man das Zählen auch der Datenbank überlassen:

Code: Alles auswählen

with closing(mydb.cursor()) as cursor:
    cursor.execute(
        "SELECT name_von_element_6, count(*) FROM stand where wand = %s group by name_von_element_6",
        [SE],
    )
    result = dict(cursor)
    if result:
        for _ in range(result.pop('r', 0)):
            print('r')
        for _ in range(result.pop('v', 0)):
            cursor.execute(
                "INSERT INTO stand (wand, boden, decke, schrank, stuhl)"
                " VALUES (%s, %s, %s, %s, %s)",
                [xDu01, xDu02, xDu03, xDu04, xDu05],
            )
            mydb.commit()
        for _ in range(sum(result.values())):
            print("In DB ohne Zuordnung")
    else:
        cursor.execute(
            "INSERT INTO bude (bu01, bu02) VALUES (%s, %s)",
            [xBu01, xBu02],
        )
        mydb.commit()
        print("In DB Eingetragen")
Antworten