Q&A
SqlAlchemyで複合主キーを持つテーブルへのリレーションの指定の仕方がわからず困っています
以下の例のソースコードで言うと、
articleを取得して、joinedloadでcommentsを指定したときにarticle_idとday_noで自動的に結合されてcommentsも取ってこれる状態にしたいです。
公式や、こちらの記事を参考にいろいろ試しているのですが、うまくいきませんでした。
python
1from sqlalchemy.ext.declarative import declarative_base 2from sqlalchemy import create_engine, Column, Integer, String, MetaData, ForeignKey, ForeignKeyConstraint 3from sqlalchemy.orm import joinedload, relationship, sessionmaker 4import logging 5 6SQLITE = 'sqlite:///memory:' 7engine = create_engine(SQLITE) 8logging.basicConfig() 9logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) 10metadata = MetaData() 11 12 13metadata = MetaData() 14Base = declarative_base() 15 16class Article(Base): 17 __tablename__ = 'article' 18 article_id = Column(Integer, primary_key=True) 19 day_no = Column(Integer, primary_key=True) 20 title = Column(String(255)) 21 comments = relationship( 22 "Comment", backref="article", foreign_keys="[Comment.article_id,Comment.day_no]" 23 ) 24 25class Comment(Base): 26 __tablename__ = "comment" 27 article_id = Column(Integer, ForeignKey("article.article_id"), primary_key=True) 28 day_no = Column(Integer, ForeignKey("article.day_no"), primary_key=True) 29 text = Column(String(100)) 30 ForeignKeyConstraint(['article_id', 'day_no'],['article.article_id', 'article.day_no']) 31 32 33Session = sessionmaker(bind=engine) 34 35session = Session() 36 37def insert_article(session): 38 d = [] 39 for i in range(1,10): 40 for j in range(1,10): 41 d.append( 42 Article( 43 article_id = i, 44 day_no = j, 45 title = f"{i},{j}タイトル" 46 ) 47 ) 48 session.add_all(d) 49 session.commit() 50 51def insert_comment(session): 52 d = [] 53 for i in range(1,10): 54 for j in range(1,10): 55 d.append( 56 Comment( 57 article_id = i, 58 day_no = j, 59 text = f"{i},{j}コメント" 60 ) 61 ) 62 session.add_all(d) 63 session.commit() 64 65 66 67Base.metadata.create_all(bind=engine) 68insert_article(session) 69insert_comment(session) 70 71articles = session.query(Article).options(joinedload(Article.comments)).all() 72 73 74for article in articles: 75 comments = [] 76 for comment in article.comments: 77 comments.append(comment.text) 78 print(article.day_no, article.article_id, article.title, comments)
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。