web-dev-qa-db-fra.com

Flask sqlalchemy insère des données plusieurs à plusieurs

J'essaie de faire une relation plusieurs à plusieurs ici dans Flask-SQLAlchemy, mais il semble que je ne sache pas comment remplir le "identificateur plusieurs à plusieurs base de données ". Pourriez-vous s'il vous plaît m'aider à comprendre ce que je fais mal et à quoi il est censé ressembler?

class User(db.Model):
    __table= '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):
    __table= 'classes'
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)

et puis ma base de données d'identifiant:

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'))
)

jusqu'ici, cela ressemble à ceci lorsque j'essaie d'insérer les données dans la base de données.

# 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()

Maintenant, mon problème est, comment puis-je ajouter à la base de données many to many, étant donné que je ne peux vraiment pas créer d'objet 'student_identifier'? Si je pouvais, cela aurait peut-être ressemblé à ceci:

# 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()

Comment je suis supposé insérer dans une table plusieurs à plusieurs avec ORM?

58
Sigils

Vous n'avez rien besoin d'ajouter directement à votre table d'association, SQLAlchemy le fera. C'est plus ou moins de documentations SQLAlchemy :

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):
    __table= 'left'
    id = db.Column(db.Integer, primary_key=True)
    children = db.relationship("Child",
                    secondary=association_table)

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


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

Par conséquent, votre échantillon ressemblerait à ceci:

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):
    __table= '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):
    __table= 'classes'
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)
    students = db.relationship("Student",
                               secondary=student_identifier)

s = Student()
c = Class()
c.students.append(s)
db.session.add(c)
db.session.commit()
102
Mehdi Sadeghi

Tout d'abord, student_identifier est défini comme une table de réflexion SQLAlchemy et non comme une base de données.

Normalement, si toutes les relations sont correctement configurées entre les modèles et les objets de table de réflexion, il vous suffira de traiter les modèles associés (en ajoutant des objets de modèle à la relation InstrumentList) pour insérer des données dans des tables de réflexion, par exemple, la réponse mehdi-sadeghi fourni ci-dessus.

Cependant, il existe effectivement un moyen d'insérer directement dans les tables de réflexion si vous ne souhaitez pas configurer la relation. Par exemple:

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

Après cela, vous devriez être en mesure de voir qu'une ligne de relation plusieurs à plusieurs est insérée dans le student_identifier table de réflexion. N'oubliez pas de valider après avoir exécuté chaque instruction SQL comme dans une transaction.

J'espère que cela vous aidera avec une approche alternative.

4
Devy