Flask sqlalchemy plusieurs à plusieurs insérer des données
J'essaie de faire une relation plusieurs à plusieurs ici dans Flask-SQLAlchemy , mais il semble que je ne sais pas comment remplir la base de données "many to many identifier database" . Pourriez-vous m'aider à comprendre ce que je fais mal et à quoi il est censé ressembler?
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)
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'à présent, il ressemble à ça 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='john@doe.es')
user2 = User(
user_fistName='Jack',
user_lastName='Doe',
user_email='jack@doe.es')
user3 = User(
user_fistName='Jane',
user_lastName='Doe',
user_email='jane@doe.es')
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, puisque je ne peux vraiment pas créer un 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 censé insérer dans une table plusieurs à plusieurs avec ORM?
2 réponses
Vous n'avez pas besoin d'ajouter quoi que ce soit directement à votre table d'association, SQLAlchemy le fera. C'est plus ou moins à partir 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):
__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()
Par conséquent, votre échantillon serait comme 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):
__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)
students = db.relationship("Student",
secondary=student_identifier)
s = Student()
c = Class()
c.students.append(s)
db.session.add(c)
db.session.commit()
Tout d'abord, student_identifier
est défini comme une table de réflexion SQLAlchemy pas une base de données.
Normalement, si vous avez correctement configuré toutes les relations entre les modèles et les objets de table de réflexion, vous n'aurez qu'à gérer les modèles associés (en ajoutant des objets de modèle dans la liste D'Instruments de relation) afin d'insérer des données dans les tables de réflexion, par exemple, la réponse @mehdi-sadeghi fournie ci-dessus.
Cependant, il existe en effet un moyen d'insérer directement dans les tables de réflexion si vous ne voulez 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 pouvoir voir qu'une ligne de relation plusieurs à plusieurs est insérée dans la table de réflexion student_identifier
. 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.