次のように定義された 3 つのテーブルがあります。
class User(Base):
__tablename__ = 'users'
id = Column(Integer(10), primary_key=True)
firstname = Column(String(64))
surname = Column(String(64))
class SWMS(Base):
__tablename__ = 'swms'
id = Column(Integer(10), primary_key=True)
owner_id = Column(Integer(10), ForeignKey('users.id', ondelete='CASCADE'))
filename = Column(String(255))
swmowner = relationship('User', backref=backref('users'))
class SWM_perms(Base):
__tablename__ = 'swm_perms'
id = Column(Integer(10), primary_key=True)
swm_id = Column(Integer(10), ForeignKey('swms.id', ondelete='CASCADE'))
user_id = Column(Integer(10), ForeignKey('users.id', ondelete='CASCADE'))
swm = relationship('SWMS', backref=backref('swms'))
swmuser = relationship('User', backref=backref('swmusers'))
基本的に、SWMS テーブルは、ドキュメントを作成したユーザーを owner_id で定義するドキュメント情報のテーブルです。SWM_perms は、ドキュメント ID からユーザー ID へのマッピングを持つテーブルで、ドキュメントの表示を許可するユーザーを定義します。
1) ユーザーが所有している、または 2) ユーザーが表示できるすべてのドキュメントのテーブルを作成するには、SQL で次のようにします。
select owner_id, users.firstname, users.surname, filename
from swms, swm_perms, users
where users.id=swms.owner_id and
((swms.id=swm_perms.swm_id and swm_perms.user_id = 27) or (owner_id = 27));
このクエリを sqlalchemy でどのように定義しますか? or_() 関数には精通していますが、試しているバリアントは正しいオブジェクトを生成しません。