Seite 1 von 1

Datenbank Abfrage fragwürdig

Verfasst: Mittwoch 30. Juni 2021, 21:54
von gomez72
Hallo,

ich bekomme bei einer Abfrage (für mich) fragwürdige Datenbank Werte zurück. Vielleicht kann mir jemand weiterhelfen.

Ich nutze eine MYSQL Datenbank.
die ich wie folgend in initialisiere:

Code: Alles auswählen

import mysql.connector

# initialize Database
db = mysql.connector.connect(
    user='root',
    password='^dfdfsfdf545äöp#äüdfv56erg^y##)Yk',
    host='127.0.0.1',
    database='test_db')
Ich möchte aus der Datenbank den Usernamen mit meinem Input vergleichen um eine Anmeldung zu gestalten:

Code: Alles auswählen

def change_user():
    display_main_title()
    mycursor = db.cursor()
    mycursor.execute("SELECT username FROM User")
    myresult = mycursor.fetchall()
    print(myresult)
    user = input(" \n\n\n Gib für die Anmeldung deinen Benutzer Namen ein: ")

    result = 0
    for row in myresult:
        if str(row[0]) == user:
            result = 1
            break
        else:
            result = 0

    if result == 1:
        display_main_title()
        write_user(user)
        read_user()
        print(" --- Die Anmeldung war erfolgreich ---")

    else:
        print("Die Anmeldung war nicht erfolgreich")
        write_user("kein Nutzer")

der Ausdruck

Code: Alles auswählen

print(myresult)
liefert mir folgende Ausgabe
[('Sepp',), ('Karin',), ('Martin',)]


Jetzt meine Frage: warum sind in den Tupels in der Liste nicht einfach die "nackten Strings" enthalten.
Sondern da ist nochmal ein Komma mit enthalten. So dass ich auch auf den eigentlichen Namen mit

Code: Alles auswählen

str(row[0])
zugreifen muss.
Ist das normal oder stimmt irgendetwas am code nicht ?

Zur Datenbank fällt mir auch nicht viel ein:
username VARCHAR(25)



vielen Dank schonmal

Re: Datenbank Abfrage fragwürdig

Verfasst: Mittwoch 30. Juni 2021, 22:06
von __blackjack__
Das ist normal. Ergebnisse sind Tupel mit einem Element pro Wert. Du fragst nur `username` ab, also sind das Tupel mit einem Element. Der `str()`-Aufruf ist überflüssig, das sind ja bereits Zeichenketten.

Wobei man die Aufgabe hier normalerweise an die Datenbank delegieren würde, beispielsweise in dem man zählt wie oft der eingegebene Benutzername in der Tabelle vor kommt. Davon ausgehend, das Benutzernamen eindeutig sein müssen, wäre das Ergebnis 1 oder 0. Also das was Du anscheinend als Ergebnis haben möchtest.

Die Datenbankverbindung sollte nicht auf Modulebene erstellt werden. Module sollte man importieren können, ohne dass so gravierende Effekte wie der Aufbau einer Datenbank passiert.

Funktionen sollten alles was sie ausser Konstanten benötigen, als Argument(e) übergeben bekommen.

Die Vorsilbe `my` ist sinnfrei wenn es das gleiche nicht auch mit `their` oder `our` gibt, wogegen man das abgrenzen müsste.

Re: Datenbank Abfrage fragwürdig

Verfasst: Mittwoch 30. Juni 2021, 22:15
von gomez72
__blackjack__ hat geschrieben: Mittwoch 30. Juni 2021, 22:06 Das ist normal.

Dank dir sehr __blackjack__!

Re: Datenbank Abfrage fragwürdig

Verfasst: Samstag 10. Juli 2021, 22:08
von Max07t
Das ist normal. Bei SQL, SQLite, etc. kommt bei einer Datenbankabfrage (fast) immer ein Tuple. Du kannst es wie eine Liste behandeln, nur dass du nichts appenden oder removen kannst.