Python / Datenbank: Könnt ihr mir diesen Codeabschnitt erklären?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Einmal angenommen, du hast diese Datenbanktabelle:

PLZ     |  Ort        |  Straße         |  Hausnummer 
------------------------------------------------------
12685   | Berlin      | Blenheimstraße  | 27
1200    | Wien        | Bäuerlegasse    | 11
4051    | Basel       | Leonhardsstraße | 59

und aus der wurden mit einem SQL SELECT-Query alle Einträge ausgewählt.

Dann würde die fetchall-Methode ein Ergebnisobjekt zurückgeben (dbresult), welches all diese Datensätze (Reihen) speichert. Jeder Datensatz wird durch ein Tuple repräsentiert. Jeder Eintrag des Tuple entspricht einem Spaltenwert.

So wäre also der erste Spaltenwert des ersten Eintrags die 12685 oder der dritte Spaltenwert des zweiten Eintrags die Bäuerlegasse.

Die Schleife läuft nun über alle Datensätze. Je Schleifenlauf wird der aktuelle Datensatz in result gespeichert. Im Anschluss wird ein Objekt der Klasse Adresse angelegt und dem die einzelnen Spaltenwerte überreicht. Dieses Objekt wird danach in eine Liste (adressen) eingefügt.

Unter der Annahme, dass im Konstruktor die einzelnen Argumente als Attribute abgespeichert wurden, also beispielsweise so:

class Adresse:
  def __init__(self, plz, ort, strasse, hausnummer):
    self.plz = plz
    self.ort = ort
    self.strasse = strasse
    self.hausnummer = hausnummer

könnte man am Ende des Programmcodes davon ausgehen, dass alle Daten (d.h. konkret die ersten vier Spalten jeden Datensatzes aus der Ergebnistabelle - was da nun tatsächlich drinsteht, müsstest du bei deiner Datenbank selbst nachschauen) in der Liste adressen in Form von Objekten übertragen wurden.


Lindner12 
Fragesteller
 05.06.2023, 21:16

Danke!

Im Anschluss wird ein Objekt der Klasse Adresse angelegt und dem die einzelnen Spaltenwerte überreicht.

Warum muss/wird ein Objekt angelegt?

0
regex9  05.06.2023, 21:45
@Lindner12

Damit lässt sich leichter arbeiten.

Du könntest die Daten natürlich auch in anderen Formaten speichern. Zum Beispiel in einer Liste aus Listen:

adressen = []

for result in dbresult:
  adresse = [result[0], result[1], result[2], result[3]]
  adressen.append(adresse)

oder in einer Liste aus Tuples:

adressen = []

for result in dbresult:
  adresse = (result[0], result[1], result[2], result[3])
  adressen.append(adresse)

Aber dann musst du, wenn du eine bestimmte Information (z.B. den Ort) wieder herausziehen möchtest, wissen, in welchem Eintrag sie steht. Im ersten, zweiten, dritten oder vierten?

ort_aus_erstem_eintrag = adressen[0][1] # Berlin
hausnummer_aus_erstem_eintrag = adressen[0][3] # 27

Bei einem Objekt kannst du die Informationen im Code mit einem Namen (dem Namen des Attributs) assoziieren:

ort_aus_erstem_eintrag = adressen[0].ort # Berlin
hausnummer_aus_erstem_eintrag = adressen[0].hausnummer # 27

Der Code wird einfacher lesbar und bei der Entwicklung reduzierst du die Wahrscheinlichkeit, einen Fehler einzubauen, wenn du mit den Daten arbeiten möchtest.

1