Je tente de créer un backend avec Flask et SQLAlchemy en utilisant une base de données Postgresql. Lors de la configuration du schéma dans models.py, j'ai un objet Carte et un objet Couleur. Il y a cinq couleurs et chaque carte peut être plusieurs couleurs. En tant que tel, j'essaie d'utiliser une relation de plusieurs à plusieurs avec un objet Association, ColorAssociation. Le code models.py pertinente est la suivante:SQLAlchemy Query Listes de relations multiples
class ColorAssociation(db.Model):
__tablename__ = 'color_association'
card_id = db.Column(db.Integer, db.ForeignKey('cards.id'), primary_key=True)
color_id = db.Column(db.Integer, db.ForeignKey('colors.id'), primary_key=True)
card = db.relationship("Card", back_populates="colors")
color = db.relationship("Color", back_populates="cards")
class Color(db.Model):
__tablename__ = 'colors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
cards = db.relationship("ColorAssociation", back_populates="color")
class Card(db.Model):
__tablename__ = 'cards'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
colors = db.relationship("ColorAssociation", back_populates="card")
Le schéma semble fonctionner comme après l'ajout de certaines données, je peux interroger avec succès pour toutes les cartes associé à la couleur avec le nom « Blue », par exemple en utilisant la requête suivante sqlalchemy:
blue = db.session.query(Color).filter(Color.name == 'Blue').all()[0]
for association in blue.cards:
print(association.card)
Ma question est de savoir comment je demande des cartes de plusieurs couleurs? Par exemple, comment rechercher toutes les cartes associées à des couleurs portant à la fois le nom "Bleu" et "Vert".
Fonctionne parfaitement, merci d'avoir pris le temps de recréer ça! Juste une question sur la dernière requête que vous faites. Donc la raison pour laquelle j'essaye d'utiliser l'objet Association est donc si je veux filtrer des cartes par certaines couleurs, je n'ai pas besoin de vérifier chaque carte dans le db (il y en aura environ 30 000) contre une couleur, je peux juste sélectionnez la couleur, puis filtrez ses cartes. Est-ce que la dernière requête que vous faites, puisque c'est sur la carte, vérifie chaque carte dans la base de données? Si oui, est-ce inévitable? – gategeek42
Eh bien la façon dont je le ferais est d'avoir l'objet carte avec une clé étrangère de couleur, de cette façon je peux spécifier quelles couleurs je veux. En raison de sql ayant une structure plate. les filtres (où) sont appliqués par ligne et non en groupe. Il n'y a pas moyen de contourner l'interrogation de toutes les cartes, car même les associations de couleurs ont une entrée par carte que vous avez. Et l'itération de 30 000 lignes pour une base de données n'est pas importante même si elle n'est pas correctement indexée. – will7200