python many - Flask sqlalchemy viele-zu-viele Daten einfügen




to datetime (3)

Ich versuche hier in Flask-SQLAlchemy eine Viele-zu-Viele-Beziehung herzustellen, aber es scheint, dass ich nicht weiß, wie ich die "Viele-zu-Viele-Identifikator-Datenbank" füllen soll. Könntest du mir bitte helfen zu verstehen, was ich falsch mache und wie es aussehen soll?

class User(db.Model):
    __tablename__ = 'users'
    user_id = db.Column(db.Integer, primary_key=True)
    user_fistName = db.Column(db.String(64))
    user_lastName = db.Column(db.String(64))
    user_email = db.Column(db.String(128), unique=True)


class Class(db.Model):
    __tablename__ = 'classes'
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)

und dann meine ID-Datenbank:

student_identifier = db.Table('student_identifier',
    db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
    db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'))
)

Bisher sieht es so aus, wenn ich versuche, die Daten in die Datenbank einzufügen.

# User
user1 = User(
            user_fistName='John',
            user_lastName='Doe',
            user_email='[email protected]')

user2 = User(
            user_fistName='Jack',
            user_lastName='Doe',
            user_email='[email protected]')

user3 = User(
            user_fistName='Jane',
            user_lastName='Doe',
            user_email='[email protected]')

db.session.add_all([user1, user2, user3])
db.session.commit()

# Class
cl1 = Class(class_name='0A')
cl2 = Class(class_name='0B')
cl3 = Class(class_name='0C')
cl4 = Class(class_name='Math')
cl5 = Class(class_name='Spanish')
db.session.add_all([cl1, cl2, cl3, cl4, cl5])
db.session.commit()

Jetzt ist mein Problem, wie füge ich der vielen zu vielen Datenbank hinzu, da ich wirklich kein 'student_identifier'-Objekt erstellen kann? Wenn ich könnte könnte es vielleicht so ausgesehen haben:

# Student Identifier
sti1  = StiClass(class_id=cl1.class_id, class_name=user1.user_id)
sti2  = StiClass(class_id=cl3.class_id, class_name=user1.user_id)
sti3  = StiClass(class_id=cl4.class_id, class_name=user1.user_id)
sti4  = StiClass(class_id=cl2.class_id, class_name=user2.user_id)
db.session.add_all([sti1, sti2, sti3, sti4])
db.session.commit()

Wie soll ich in eine viele zu viele Tabelle mit ORM einfügen?


Answers

Zunächst student_identifier ist student_identifier als eine SQLAlchemy-Reflektionstabelle und keine Datenbank definiert.

Normalerweise müssen Sie, wenn Sie alle Beziehungseinstellungen zwischen Modellen und Reflexionstabellenobjekten richtig eingerichtet haben, nur mit verwandten Modellen arbeiten (indem Sie Modellobjekte an die Beziehung InstrumentList anhängen), um Daten in Reflexionstabellen einzufügen, z. Mehdi-Sadeghi oben zur Verfügung gestellt.

Es gibt jedoch eine Möglichkeit, direkt in Reflexionstabellen einzufügen, wenn Sie die Beziehung nicht einrichten möchten. Beispielsweise:

statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id)
db.session.execute(statement)
db.session.commit()

Danach sollten Sie in der Lage sein zu sehen, dass eine Viele-zu-Viele-Beziehungszeile in die student_identifier eingefügt wird. Vergessen Sie nicht, nach dem Ausführen jeder SQL-Anweisung zu committen, wie es in einer Transaktion geschieht.

Hoffe das hilft dir mit einem alternativen Ansatz.


Sie müssen nichts direkt zu Ihrer Assoziationstabelle hinzufügen, SQLAlchemy wird das tun. Dies ist mehr oder weniger aus SQLAlchemy-Dokumentationen :

association_table = db.Table('association', db.Model.metadata,
    db.Column('left_id', db.Integer, db.ForeignKey('left.id')),
    db.Column('right_id', db.Integer, db.ForeignKey('right.id'))
)

class Parent(db.Model):
    __tablename__ = 'left'
    id = db.Column(db.Integer, primary_key=True)
    children = db.relationship("Child",
                    secondary=association_table)

class Child(db.Model):
    __tablename__ = 'right'
    id = db.Column(db.Integer, primary_key=True)


p = Parent()
c = Child()
p.children.append(c)
db.session.add(p)
db.session.commit()

Daher wäre Ihre Probe wie folgt:

student_identifier = db.Table('student_identifier',
    db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
    db.Column('user_id', db.Integer, db.ForeignKey('students.user_id'))
)

class Student(db.Model):
    __tablename__ = 'students'
    user_id = db.Column(db.Integer, primary_key=True)
    user_fistName = db.Column(db.String(64))
    user_lastName = db.Column(db.String(64))
    user_email = db.Column(db.String(128), unique=True)


class Class(db.Model):
    __tablename__ = 'classes'
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)
    children = db.relationship("Student",
                    secondary=student_identifier)

s = Student()
c = Class()
c.children.append(s)
db.session.add(c)
db.session.commit()

Das Hauptmerkmal von Flask-SQLAlchemy ist die korrekte Integration in die Flask-Anwendung - es erstellt und konfiguriert Engine, Verbindung und Sitzung und konfiguriert es für die Arbeit mit der Flask-App.

Dieses Setup ist ziemlich komplex, da wir die Scoped-Sitzung erstellen und entsprechend dem Lebenszyklus der Flask-Applikationsanfrage / -antwort richtig handhaben müssen.

In der idealen Welt wäre das das einzige Feature von Flask-SQLAlchemy , aber eigentlich fügt es noch ein paar weitere Dinge hinzu. Hier ist ein guter Blogbeitrag mit der Übersicht über sie: Entmystifizieren Flask-SQLAlchemy .

Als ich zum ersten Mal mit Flask und SQLAlchemy gearbeitet habe, hat mir das nicht gefallen. Ich ging rüber und extrahierte den Sitzungsverwaltungscode von der Erweiterung. Dieser Ansatz funktioniert, obwohl ich entdeckte, dass es ziemlich schwierig ist, diese Integration richtig zu machen.

Der einfachere Ansatz (der in einem anderen Projekt verwendet wird, an dem ich gerade arbeite) besteht darin, Flask-SQLAlchemy einfach zu Flask-SQLAlchemy und keine zusätzlichen Funktionen zu verwenden. Sie werden die db.session und Sie können sie verwenden, als wäre es reines SQLAlchemy Setup.





python flask sqlalchemy flask-sqlalchemy