Datenbank Abfrage fragwürdig

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
gomez72
User
Beiträge: 5
Registriert: Sonntag 28. März 2021, 09:57

Mittwoch 30. Juni 2021, 21:54

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
Benutzeravatar
__blackjack__
User
Beiträge: 8833
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 30. Juni 2021, 22:06

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.
Q: What is the volume of a pizza of radius z and thickness a?
A: pi·z·z·a
gomez72
User
Beiträge: 5
Registriert: Sonntag 28. März 2021, 09:57

Mittwoch 30. Juni 2021, 22:15

__blackjack__ hat geschrieben:
Mittwoch 30. Juni 2021, 22:06
Das ist normal.

Dank dir sehr __blackjack__!
Benutzeravatar
Max07t
User
Beiträge: 6
Registriert: Montag 21. Juni 2021, 15:23
Wohnort: Frankfurt am Main
Kontaktdaten:

Samstag 10. Juli 2021, 22:08

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.
Antworten