質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Q&A

解決済

1回答

3340閲覧

sqlalchemyで複合主キーに対して別テーブルからリレーションを設定したい

pen_ari

総合スコア50

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

0グッド

0クリップ

投稿2022/01/27 06:40

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下のように記載することで行けました

python

1class Article(Base): 2 __tablename__ = 'article' 3 article_id = Column(Integer, primary_key=True) 4 day_no = Column(Integer, primary_key=True) 5 title = Column(String(255)) 6 comments = relationship( 7 "Comment", backref="article" 8 ) 9 10class Comment(Base): 11 __tablename__ = "comment" 12 __table_args__ = (ForeignKeyConstraint(['article_id','day_no'], ['article.article_id', 'article.day_no']), {}) 13 article_id = Column(Integer, primary_key=True) 14 day_no = Column(Integer, primary_key=True) 15 text = Column(String(100))

投稿2022/01/27 07:16

pen_ari

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問