Einzelne Felder einer MySQL Tabelle auslesen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Du zeigst keinen lauffähigen Python-Code der das Problem zeigt und auch Deine PHP-Codeschnippsel sind kein lauffähiger PHP-Code. `mysql_fetch_array()` & Co sind zudem seit PHP 5.5 veraltet und seit PHP 7 nicht mehr verfügbar.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Wer den Morgen Abend mal reinsetzen .

Danke im Voraus .

Ich wollte einfach nur wissen wie man einzelne Elemente einer Tabelle ausliest eines User .

Ist ja nicht schwer zu verstehen .

Das Script funktioniert ja soweit Ebend nur das er alles ausgibt von den User . Abrr er ich will die einzelnt verschachteln in einer Tabelle .

Zum Thema Buch, ich habe das Python 3 Buch von Peter Kaiser und das ist richtig gut .

Habe gelernt Klassen zu erstellen Funktion etc. außer MySQL wurde da zu wenig erklärt .
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Die DB V2 API definiert als kleinsten gemeinsamen Nenner eine Sequenz pro Datensatz, also Beispielsweise ein Tupel. Einige Datenbankmodule ermöglichen es andere Datentypen zu liefern, in dem man das angibt. Einige liefern Objekte die sich sowohl wie eine Sequenz verhalten, und zusätzlich die einzelnen Bestandteile als Attribute und/oder eine Wörterbuch-API anbieten. mysql/connector hat da mehrere Möglichkeiten, die in der Dokumentation von dem Modul stehen. Ansonsten kann man sich auch selbst etwas auf Basis der DB V2 API basteln, beispielsweise in dem man mit Hilfe der Infos aus dem `description`-Attribut vom Cursor aus einzelnen Datensätzen Wörterbücher mit den Daten erstellt.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

__blackjack__ hat geschrieben: Montag 24. Februar 2025, 21:37 @TorstenVoelker: Die DB V2 API definiert als kleinsten gemeinsamen Nenner eine Sequenz pro Datensatz, also Beispielsweise ein Tupel. Einige Datenbankmodule ermöglichen es andere Datentypen zu liefern, in dem man das angibt. Einige liefern Objekte die sich sowohl wie eine Sequenz verhalten, und zusätzlich die einzelnen Bestandteile als Attribute und/oder eine Wörterbuch-API anbieten. mysql/connector hat da mehrere Möglichkeiten, die in der Dokumentation von dem Modul stehen. Ansonsten kann man sich auch selbst etwas auf Basis der DB V2 API basteln, beispielsweise in dem man mit Hilfe der Infos aus dem `description`-Attribut vom Cursor aus einzelnen Datensätzen Wörterbücher mit den Daten erstellt.
Vielen Dank für die Information!
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie man an einzelne Daten kommt hatte ich dir schon geschrieben... musst du "nur" lesen und umsetzen. Oder _konkret_ Fragen, wenn du was nicht verstehst.

Buch: Wenn du das Buch hast https://www.rheinwerk-verlag.de/python- ... gAgZZkUAcF: das hat einen legendär schlechten Ruf hier im Forum, weil es in Teilen schlechtes / unpythonisches Python zeigt und die Autoren es über mehrere Auflagen nicht geschafft haben, Fehler zu korrigieren. Also man kann damit schon lernen, wenn man bereit ist, bestimmt Sachen später richtig zu lernen und das, was in Teilen im Buch steht, einfach zu vergessen. Und abgesehen davon: nur mit dem / einen Buch lernen geht auf gar keinen Fall. Du _musst_ parallel in der Python Doku lesen und in den Doku der von der verwendeten Python-Module. Sonst bleibst du sehr früh auf einem sehr niedrigen Niveau hängen.

Gruß, noisefloor
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

noisefloor hat geschrieben: Samstag 22. Februar 2025, 17:46 Hallo,

hat @Sirius3 doch in seinem Post viewtopic.php?p=433107#p433107 gezeigt / verwendet.

Gruß, noisefloor
Danke für den Hinweis und für den Rat nur bin ich mit den hash noch nicht vertraut was das alles bedeutet und welche Auswirkung der Befehl hat ..
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Das hat doch mit der Abfrage der Daten nichts zu tun, und eine Anmeldung macht lokal doch sowieso keinen Sinn.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
nur bin ich mit den hash noch nicht vertraut was das alles bedeutet und welche Auswirkung der Befehl hat ..
Das ist doch auch total egal für dich. Relevant sind die beiden Zeilen:

Code: Alles auswählen

cursor.execute("SELECT hashed_password FROM accounts WHERE username = %s", [username])
result = cursor.fetchone()
Die beantworten deine Frage. Wenn du die beiden Zeilen nicht verstehst: was verstehst du nicht? Kannst du das nicht auf deine Anwendung übertragen? Das sind wirklich Basics, die du verstehen musst, sonst wird das mit dir, Python und der Datenbankabfrage nichts.

Apropos Datenbank: brauchst du eine netzwerkfähig Datenbank, die parallele Schreibzugriffe unterstützt? Wenn nein -> nimm' SQLite. Das ändert zwar am Prinzipiellen Vorgehen nichts, aber du hast viel mehr Doku zu Python, SQLite und der DB API 2.0 Schnittstelle in der Python Doku. Ich glaube, dass könntest du gut gebrauchen.+

Gruß, noisefloor
Benutzeravatar
DeaD_EyE
User
Beiträge: 1205
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

sparrow hat geschrieben: Dienstag 18. Februar 2025, 19:05 Ich würde dazu raten, etwas wie SQLAlchemy zu verwenden und ein Webframework wie Django oder Flask, wenn es eine Webanwendung sein soll.
Das habe ich mal auf einem RPi 0 W gemacht und habe mich dafür gehasst. Bis das Programm geladen war, vergingen ca. 10 Sekunden. Wozu? Für eine einfache sqlite3-Datenbank. Das war sowas von überflüssig.
Wenn man doch nur ein Feld aus der DB haben möchte, verwendet man kein ORM. Das ist, wie mit Kanonen auf Spatzen schießen. Kann man machen :D
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE Ich würde mich auch dafür hassen einen RPi 0 W für ein Finanzbuch zu verwenden. Ernsthaft: Das Teil hat einen langsamen Prozessor und eine noch lahmarschigere SD-Karte als Massenspeicher und sollte nicht Basis für Tipps für die Entwicklung von Desktop-Anwendungen sein. Sonst könnte man auch anfangen Python für Desktopanwendungen in Frage zu stellen weil C viel effizienter auf Mikroprozessoren ist. 😇
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Guten Abend, ich brauche mal kurz Hilfe .

Ich habe es soweit geschafft mir ein kleines finanzbuch zu bauen aber ich hänge an einen Teil fest .

Ich habe ein Eingabefeld also ein Entry und das soll mein Name natürlich eingetragen werden und jetzt will ich es so machen wenn der username username ist gibt mir die Daten . Ich habe es Manuel getestet also select username Form Daten where username = 'Thorsten' das geht aber ich will jetzt die variable da einbauen wie mache ich das ?

Lg
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt ja nur drei Beiträge nach oben scrollen: viewtopic.php?p=433203#p433203
Wobei SELECT-Befehl so keinen Sinn macht. Warum willst Du den username wissen, den Du ja als Parameter in im where-Ausdruck schon hast?
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Danke nochmal für den Hinweis.
Ich habe mich für den 07.04 bei einen Kurs angemeldet wo ich komplett 4 Wochen in einen ganztags Unterricht es lernen werde . So das ich alles über Klassen weiß Funktion MySQL etc.

Weil ich will es unbedingt lernen und Bücher habe ich gemerkt bringen einen ein Stück voraus aber nicht direkt ans Ziel .

Soweit verstehe ich Python schon damit umzugehen aber es gibt sehr oft Hürden wo man stecken bleibt .
Das habe ich den Kurs Leiter so erklärt. Er meinte nach dem Seminar werde ich selber Anwendungen schreiben können mit Klassen etc .
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo ich muss nochmal das Thema MySQL auslesen Einzelne Daten aufgreifen

Ich komme soweit mit dem Thema SQL in Python gut klar und freier mich selbst darüber aber ich habe Nichteinhaltung Anliegen .

Wie schon am Anfang des Threads habe ich folgendes Problem.

Ich habe vor aus meiner Tabelle log eine Auflistung zu machen wie zb

Code: Alles auswählen

Cursor.execute('Select * From log where username = %s',user)

Result = cursor.fetchall()


For Name in result 

# hier möchte ich gerne das man einzelne Zellen anspricht zb Feld Name , Ort usw 



Das es dann so aussieht

Name : Thorsten
Ort : Duisburg
Usw

Wie könnte ich es umsetzen .?


Lg
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@TorstenVoelker: Ich glaube das mit dem * wurde schon mal gesagt: Es ist weniger fehleranfällig/robuster gegen Änderungen wenn man beim SELECT explizit angibt welche Spalten selektiert werden sollen. Dann ist man unabhängig davon in welcher Reihenfolge die in der Datenbank definiert sind und hat auch kein Problem wenn Spalten hinzugefügt werden. Ausserdem hilft es auch beim Lesen/Verstehen vom Code weil man dann nicht raten muss was da konkret selektiert wird.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). `Cursor`, `Result` und `Name` wären Klassennamen und keine Namen für andere Objekte. Python unterscheidet auch zwischen Gross- und Kleinschreibung. Man kann also nicht `Cursor` und `cursor` oder `Result` und `result` schreiben und jeweils das gleiche meinen wollen.

Die DB-API v2 also PEP 249 – Python Database API Specification v2.0 sagt, das die einzelnen Datensätze von den `Cursor.fetch*()`-Methoden als Sequenzen geliefert werden. Also kann man die in ``for``-Schleifen wie bei Zuweisungen auf Namen verteilen (``for name, ort, … in results:``). Die Spaltennamen kann man sich nach dem SELECT aus dem `description`-Attribut vom `Cursor`-Objekt holen. Und mit der Information kann man aus jedem Datensatz ein Wörterbuch machen, wenn man möchte. Viele konkrete Datenbankmodule bieten dafür auch schon einen nicht-standardisierten Weg an. So auch `mysql.connector`. Ich persönlich binde mich nicht so gerne an konkrete DBMS oder auch Datenbankmodule und würde da eher auf SQLAlchemy als Abstraktionsschicht setzen, wenn ich Komfort jenseits der DB-API v2 haben möchte.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Danke für Dein langes Statement.

Habe mich sehr lange damit jetzt beschäftigt und es wird immer besser mit dem programmieren aber kleine fallen und Stolpersteine gibt es immer wieder ,
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Hallo zusammen ,

da ich jetzt mal ein Script gebaut habe das für einen user , den Namen , Kontostand , Kontonummer ausgeben soll.

So funktioniert es aber jetzt kommt das wo ich mein Problem habe .

In der Abfrage muss ich 3 Abfragen machen um überhaubt 3 verschiedene Felder auslesen zu können .
Was ich wissen wollte , kann ich es in einer Abfrage darstellen das dann genau so aussieht wie in der Print Anweisung ?
Weil es wäre sonst immer zu umständlich .

Wäre schön wenn mir einer ein Beispiel geben würde, wie es aussehen könnte .

Habe es versucht was @blackjack gepostet hat umzusetzen aber irgendwie haut das nicht hin .




Hier mein Script

Code: Alles auswählen

from collections import namedtuple


from data import conn

class kunde:
    def __init__(self,username,konto,kontostand):
        self.username = username
        self.konto = konto
        self.kontostand = kontostand



verbindung = conn()
cursor = verbindung.cursor()
cursor.execute("SELECT username FROM bank WHERE konto = '1301798649'")
result = cursor.fetchone()
verbindung.close()

for name in result:
    user = name

verbindung2 = conn()
cursor2 = verbindung2.cursor()
cursor2.execute("SELECT konto FROM bank WHERE konto = '1301798649'")
result2 = cursor2.fetchone()
verbindung2.close()

for name2 in result2:
    konto = name2

verbindung3 = conn()
cursor3 = verbindung3.cursor()
cursor3.execute("SELECT kontostand FROM bank WHERE konto = '1301798649'")
result3 = cursor3.fetchone()
verbindung3.close()


for name3 in result3:
    kontostand = name3




kunde1 = kunde(user,konto,kontostand)



print(f"Username = {kunde1.username} \n Kontonummer : {kunde1.konto} \n Kontostand : {kunde1.kontostand} Euro ")
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

`data` ist ein schlechter Name für ein Modul. Und conn ist wahrscheinlich die Datenbankverbindung?
Klassen werden mit großem Anfangsbuchstaben geschrieben, damit man sie als Klasse erkennen kann.
for-Schleifen sind eigentlich dazu da, für gleichartige Objekte immer das selbe zu tun, Du benutzt es aber dazu, ein einelementiges Tuple zu entpacken, dazu gibt es aber Tuple-Unpacking. Statt drei einzelner Abfragen, mach doch einfach eine einzige.
Es ist seltsam, dass Du konto abfragst, das Du ja als Filter in die Abfrage hineingibst. Was erwartest Du, dass da herauskommt?
Man nummeriert keine Variablennamen, entweder hat man bessere Namen und will eigentlich eine Liste verwenden.

Code: Alles auswählen

from contextlib import closing
from database import create_database_connection

class Kunde:
    def __init__(self,username,konto,kontostand):
        self.username = username
        self.konto = konto
        self.kontostand = kontostand


def main():
    with closing(create_database_connection() as connection):
        kontonummer = '1301798649'
        cursor = connection.cursor()
        cursor.execute("SELECT username, kontostand FROM bank WHERE konto = %s", (kontonummer,))
        username, kontostand = cursor.fetchone()
        kunde = Kunde(username, kontonummer, kontostand)
    print(f"Username = {kunde.username} ")
    print(f" Kontonummer : {kunde.konto} ")
    print(f" Kontostand : {kunde.kontostand} Euro ")

if __name__ == "__main__":
    main()
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du hast doch nach eigenen Angaben früher PHP + MySQL benutzt, richtig? Die Frage zeigt aber, dass dir für SQL-Queries echt grundlegende Grundlagen fehlen... Die Frage, wie man mehrere DB-Felder in einem Query abfragt, hat so rein gar nichts mit Python zu tun...

Statt der gezeigten Klassen kann man für dieses Beispiel auch das `dataclass` Modul nutzen, was Python an Bord hat. Wenn die Klasse aber später noch um X Methoden erweitertet werden soll, dann macht eine Klasse Sinn. Wenn nur die drei Daten gehalten werden sollen -> dataclass.

Gruß, noisefloor
TorstenVoelker
User
Beiträge: 124
Registriert: Mittwoch 5. Februar 2025, 12:55

Erstmal danke für die Antwort, aber MySQL Abfrage über php oder Python sind schon große Unterschiede.

Wäre es möglich mir ein kleines Beispiel zu geben wie ich zb aus einer Abfrage 3 Abfragen herausbekomme .

Also das select Name , Konto , Nummer from Bank ….. das weiß ich nur in der Schleife wenn ich es auslese bekomme ich ja alle 3 komplett .

Ich hoffe es ist verständlich was ich meine .
Antworten