Python mit SQL | Klammern&Komma aus Variable löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DerKian
User
Beiträge: 7
Registriert: Samstag 28. Mai 2022, 21:13

Moin Moin zusammen,

ich habe in einer Datenbank Username und Password für ein Login Fenster gespeichert, wenn ich allerdings per Select die beiden Daten aus der Datenbank raussuche und unter einer variable speichere, habe ich die ganzen Klammern und Kommas dabei. Gibt es eine Möglichkeit diese zu löschen ?

Viele Grüße
Kian

Code: Alles auswählen

dbcon = sqlite3.connect("vg.db")
cursor = dbcon.cursor()

cursor.execute("SELECT username FROM Logindaten")
username = cursor.fetchall()
print(username)
cursor.execute("SELECT pass FROM Logindaten")
passw = cursor.fetchall()
print(passw)
print(username)
Output:
https://prnt.sc/BUSPyRyBcVWe
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du die Ergebnisse nicht stumpf in einen String wandelst. Sondern einzeln auf Zeilen und Spalten zugreifst.
DerKian
User
Beiträge: 7
Registriert: Samstag 28. Mai 2022, 21:13

Könntest du mir vielleicht mit einem Code Beispiel weiterhelfen? So sagt mir das nichts
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DerKian: Da gibt es keine Klammern und Kommas, denn das ist keine Zeichenkette die Du da bekommst, sondern eine Datenstruktur aus Listen und Tupeln. Da musst Du halt entsprechend mit umgehen.

Wobei das auch ein bisschen komisch aussieht was Du da machst, denn `username` und `passw` sind als Namen falsch/irreführend, denn Du fragst *alle* Benutzernamen und *alle* Passwörter ab. Und das getrennt, ohne irgendwie zu sortieren. Da scheint nur ein Eintrag in der Tabelle zu sein, aber sowie da mehr drin sind, ist nicht garantiert, das die Einträge in den Listen auch tatsächlich zusammen gehören, weil die Datenbank die in beliebiger Reihenfolge liefern darf. Auch falls sie das (scheinbar) nicht tun sollte, darf man sich da nicht drauf verlassen.

Namen sollte man nicht kryptisch abkürzen. Weder im Programm noch in SQL in Tabellen oder Spaltennamen. Also `password` statt `pass` als Spaltenname und `passw` im Programm müsste `passwords` heissen. `dbcon` wäre `db_connection`.

Sowohl den Cursor als auch die Verbindung sollte man nach Gebrauch schliessen. `contextlib.closing()` und die ``with``-Anweisung, oder alternativ ``try``/``finally`` sichern das ab.

Code: Alles auswählen

#!/usr/bin/env python3
import sqlite3
from contextlib import closing


def main():
    with closing(sqlite3.connect("vg.db")) as db_connection:
        with closing(db_connection.cursor()) as cursor:
            cursor.execute("SELECT username, password FROM login_data")
            login_data = cursor.fetchall()

    print(login_data)


if __name__ == "__main__":
    main()
Textausgaben bitte nicht als Bild hier einfügen oder woanders hochladen, sondern als Text in den Beitrag kopieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DerKian
User
Beiträge: 7
Registriert: Samstag 28. Mai 2022, 21:13

Danke für deine umfangreiche Antwort. Ich habe deine Tipps umgesetzt aber habe immer noch mein altes Problem.
Der Benutzername und das Password wird als [('Aven')] und [('Punkte')] ausgegeben, allerdings werden die beiden Variablen als Vergleich für Passwort und Benutzername in einem Login Fenster benutzt, weshalb sie wirklich nur unter Aven und Punkte gespeichert werden dürfen.

Code bei der Password und Benutzername abfrage folgt:

Code: Alles auswählen

def login():
    if user.get()==(username) and user3.get()==(password):
        main()
        w_login.destroy()

    else:
        wrongpass()
Bitte nicht über die Wahl von user und user3 beschweren (wird noch geändert) also wie bekomme ich nun aus [('Aven')] nur noch Aven?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du __blackjack__s Code benutzt, bekommst Du eine Liste von Tupeln aus username und password.
Wie sieht Dein Code also jetzt komplett aus?
Listen und Tuple gehören zu den absoluten Grundlagen. Wer die noch nicht beherrscht, sollte noch nicht versuchen GUIs zu programmieren.
Alles was Funktionen brauchen, müssen sie über ihre Argumente bekommen. Benutze keine globalen Variablen.
Und man speichert niemals Passwörter im Klartext sondern nur in gehashter Form.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DerKian: Die Abfrage passt doch auch gar nicht wirklich zu dem Vorgehen was man bei einer Anmeldung benötigt. Da braucht man von der Datenbank doch nicht *alle* Benutzernamen und *alle* Passwörter, beziehungsweise deren Hashes, sondern nur den Hash zu dem eingegebenen Benutzernamen. Man muss also mindestens mal den eingegebenen Benutzernamen mit in der Abfrage in einer Bedingung beim SQL haben, um gezielt den dazugehörigen Hash-Wert abzufragen. Aber wenn man diese Bedingung stellt, kann man auch gleich Benutzernamen *und* Hash in die Abfragebedingung beim SQL schreiben, und die Datenbank den kompletten Test machen lassen, und einfach nur Testen ob dabei ein Ergebnis kommt oder nicht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten