2010-02-01 8 views
2

Dans le SQLAlchemy ORM tutorial, il décrit le processus de création de relations d'objet à peu près comme suit. Supposons que j'ai une table Articles, un tableau Mots-clés, et une table Articles_Keywords qui crée une relation many-many.SQLAlchemy ORM Insertion d'objets associés sans les sélectionner

article = meta.Session.query(Article).filter(id=1).one() 
keyword1 = meta.Session.query(Keyword).filter(id=1).one() 
keyword2 = meta.Session.query(Keyword).filter(id=2).one() 
article.keywords = [keyword1,keyword2] 
meta.Session.commit() 

J'ai déjà la clé primaire numéros d'identification pour les mots-clés en question, donc tout ce que je dois faire est d'ajouter ces ID à la table Articles_Keywords, lié à cet article. Le problème est que pour faire cela avec l'ORM, je dois sélectionner tous les mots-clés de la base de données, ce qui ajoute beaucoup de frais généraux pour apparemment pas de raison.

Existe-t-il un moyen de créer cette relation sans exécuter de SQL pour sélectionner les mots-clés?

Répondre

3

Malheureusement, l'ORM ne peut conserver l'état de l'objet sain sans interroger la base de données. Cependant, vous pouvez facilement contourner l'ORM et l'insérer dans la table d'association. En supposant que Articles_Keywords est un objet Table:

meta.Session.execute(Articles_Keywords.delete(Articles_Keywords.c.article_id == 1)) 
meta.Session.execute(Articles_Keywords.insert(), [ 
    {'article_id': 1, 'keyword_id': 1}, 
    {'article_id': 1, 'keyword_id': 2}, 
]) 

Si vous allez dans le ORM alors collections déjà chargées ne sont pas mis à jour pour refléter les changements dans la base de données. Si vous avez besoin d'actualiser la collection appelez Session.expire dessus. Cela entraînera le rechargement de la collection la prochaine fois que vous y accéderez.

meta.Session.expire(article, ['keywords']) 
1

Les fourmis a la bonne réponse, mais aussi si vous cartographié article_keywords explicitement comme un objet d'association, vous serait tout simplement créer de nouveaux objets ArticleKeyword et les ajouter directement dans.

+0

est-il un moyen de le faire à travers la ORM cinq ans plus tard? Le contourner maintenant. – ovatsug25

+0

cette réponse * est * via l'ORM. Mappez la table secondaire, créez-en une avec les deux identifiants que vous voulez, vous y êtes. – zzzeek

Questions connexes