私は多対多の関係を持っており、リレーションテーブルには主キーだけよりも多くの列が含まれています。例として、各画像に独自のタイムアウトを設定し、スライドショーに応じてタイムアウトを設定できるスライドショーシステムについて考えてみます。ちょっとした例ですが、説明のために行う必要があります;)
だから私は次のようなことをするだろうと想像します(宣言型を使用して):
show_has_image = Table( 'show_has_image',
DeclarativeBase.metadata,
Column( 'show_id', Integer, ForeignKey( 'show.id' ) ),
Column( 'image_id', Integer, ForeignKey( 'image.id' ) ),
Column( 'timeout', Integer, default=5 ),
PrimaryKeyConstraint( 'show_id', 'image_id' )
)
class Show(DeclarativeBase):
__tablename__ = "show"
id = Column( Integer, primary_key = True )
name = Column( Unicode(64), nullable = False)
class Image(DeclarativeBase):
__tablename__ = "image"
id = Column( Integer, primary_key = True )
name = Column( Unicode(64), nullable = False)
data = Column(Binary, nullable = True)
show = relation( "Show",
secondary=show_has_image,
backref="images" )
「タイムアウト」値にアクセスするにはどうすればよいですか?これに関するドキュメントには何も見つかりません。これまでのところ、画像の取得は簡単です。
show = DBSession.query(Show).filter_by(id=show_id).one()
for image in show.images:
print image.name
# print image.timeout <--- Obviously this cannot work, as SA has no idea
# how to map this field.
前のコードで概説したように機能することを嬉しく思います。確かに、値を動的にフェッチするtimeout
プロパティをクラスに追加できます。Image
ただし、その結果、不要なSQLクエリが発生します。
むしろ、すべてを1つのクエリで返すようにしたいです。SQLでは簡単です。
SELECT i.name, si.timeout
FROM show s
INNER JOIN show_has_image si ON (si.show_id = s.id)
INNER JOIN image i ON (si.image_id = i.id)
WHERE s.id = :show_id