6

次のように定義された 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_() 関数には精通していますが、試しているバリアントは正しいオブジェクトを生成しません。

4

2 に答える 2

10
cond1 = and_(SWMS.id==SWM_perms.swm_id,SWM_perms.user_id==27)
swms = DBSession.query(User,SWMS).filter(or_(cond1,SWMS.owner_id==27)).\
                                  filter(User.id==SWMS.owner_id).all()

次に、リスト内包表記を実行して、必要なフィールドを取得できます。

details = [(u.firstname, s.filename, s.blob_key, s.last_modified) for u,s in swms]
于 2012-04-05T05:21:53.170 に答える
2

また、クエリの本文で「and_」の代わりに「&」演算子を使用できることにも注意してください。彼らがここに与える例(2番目のコードブロック)を参照してください:

http://docs.sqlalchemy.org/en/rel_1_0/core/sqlelement.html#sqlalchemy.sql.expression.and_

于 2015-08-15T21:06:51.343 に答える