Datenbank anhand einer Liste erstellen und abspeichern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Interperle
User
Beiträge: 1
Registriert: Freitag 13. September 2019, 14:35

Hallo zusammen,

ich habe ein Problem, das mich schon etwas länger beschäftigt, deswegen versuche ich es heute mal hier. Ich will eine Online Anmeldung für eine Sportveranstaltung mit Flask erstellen. Da diese Anmeldung über mehrere Seiten geht und mehrere Daten abfragt, will ich die Input Daten in einer SQLite Datenbank über Flask SQLAlchemy speichern. Da ich den Teilnehmern ermöglichen möchte (maximal) 10 Sportler und 10 Begleitpersonen in einem Anmeldeformular anzumelden ist das eine ziemliche Tipparbeit die init Funktion der Datenbank Klasse zu erstellen. Deswegen habe ich für die Sportler (lspo) und die Begleitpersonen (lbeg) jeweils eine Liste mit den Daten-Namen die abgefragt werden. Diese möchte ich dann in der Klasse/init Funktion mit einer Schleife durchlaufen, damit jedes benötigte Input aus der Liste jeweils 10mal in der init Funktion steht. Hier meine beiden Listen:

Code: Alles auswählen

lspo = ["svorname", "snachname", "sgeschlecht", "sday", "smonth", "syear", "diskus", "speer", "kugel", "sprint", "basketball", "movo", "divo", "floorball", "powerlifting", "tischtennis", "mona", "badminton", "seinzelzimmer", "sjugendzimmer", "sZiPa", "svegetarier", "sveganer", "sse"]
lbeg = ["bvorname", "bnachname", "bgeschlecht", "bday", "bmonth", "byear", "beinzelzimmer", "bjugendzimmer", "bZiPa", "bvegetarier", "bveganer", "bse"]

Hier meine Klasse:

Code: Alles auswählen

class anmeldungtest(db.Model):
    __tabelname__ = "DKS-Spiele Anmeldung"
    id = db.Column(db.Integer, primary_key = True)
    timestamp = db.Column(db.Text)
    email = db.Column(db.Text)
    consent_form = db.Column(db.Text)
    aspo = db.Column(db.Integer)
    for i in range (1, 11):
        for element in lspo:
            sportler = element + str(i)
            sportler = db.Column(db.Text)
    abeg = db.Column(db.Integer)
    for i in range (1, 11):
        for element in lbeg:
            begleitung = element + str(i)
            begleitung = db.Column(db.Text)

def __init__(self, **platzhalter**):
        self.timestamp = timestamp
        self.email = email
        self.consent_form = consent_form
        # Sportler
        self.aspo = aspo
        for i in range(1, 11):
            for element in lspo:
                addelement = str(element + str(i))
                setattr(self, addelement, addelement)
        self.abeg = abeg
        for i in range(1, 11):
            for element in lbeg:
                addelement = str(element + str(i))
                setattr(self, addelement, addelement)
Hier mein Platzhalter in "Kurzform" mit Schleife:

Code: Alles auswählen

l1 = ["timestamp", "email", "consent_form", "aspo"]
for i in range(1, 11):
    for element in lspo:
        l1.append(element + str(i))
l1.append("abeg")
for i in range(1, 11):
    for element in lbeg:
        l1.append(element + str(i))

platzhalter = " = 0, ".join(l1)
print(platzhalter)
Den Platzhalter kann ich leider auch nicht als Variable einfach einfügen. Die Liste l1 leider auch nicht.
Ein weiteres Problem ist, dass ich versuche die Daten, aus der lspo Liste, dann nach dem Abschicken (über die POST Methode) wie folgt abzuspeichern:

Code: Alles auswählen

#(j ist abhängig von der Nummer des Sportlers)
	j = 1
            for element in lspo:
                addelement = request.form.get(element + str(j))
                sportlerdata = element + str(j)
                setattr(x, sportlerdata, addelement)
                print(getattr(x, sportlerdata))
                db.session.commit()
            print(getattr(x, svorname1))
Kann mir bitte jemand weiterhelfen? Ich bin am verzweifeln!
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@Interperle: so funktioniert Python nicht und auch Datenbanken arbeiten anders.
Dir fehlen noch alle Grundlagen des Datenbankdesigns. Ähnlich wie beim Programmieren versucht man Wiederholungen zu vermeiden. Eine Tabelle mit hunderten Feldern, ist einfach auch zu unübersichtlich.

Du hast erst erst einmal nur Personen, die haben einen Namen, ein Geburtsdatum (keine drei Felder Jahr,Monat und Tag) sie haben vielleicht eine Zimmer-Präferenz, eine Essenspräferenz
und was auch immer se ist. Jedes Feld hat einen bestimmten Typ (nicht alles ist Text). Ein Datum hat z.B. einen Datumstyp, die Präferenzen sind Enums.

Eine Anmeldung besteht nur aus den Feldern Anmeldedatum, Email, und was auch immer consent_form bedeutet.

Dazu gibt es noch Tabellen, die Anmeldungen mit Spielern, Begleitperson und Sportart verknüpfen. Dazu hat jeder Eintrag in den Tabellen eine eindeutige Kennung (ID) und in der Verknüpfungstabelle werden nur die IDs gespeichert. Je nachdem, wie das ganze organisiert wird, gibt es verschiedene Möglichkeiten, wie man Sportarten mit Spielern verknüpfen kann. Dazu hast Du noch zu wenig verraten.

Wenn Du das eingeben nicht auf einer Seite machen willst, und auch die Möglichkeit haben willst, Daten nachträglich einzusehen und zu ändern, dann brauchst Du noch eine Session-Tabelle und eine User-Tabelle und entsprechende Loginmethoden. Dafür gibt es schon fertige Module für Flask.
Antworten