2

SQLAlchemy で次の結合を実行しようとしています

select * from splits s
join transactions t on t.guid = s.tx_guid
join accounts a on a.guid = s.account_guid
left join splits s2 on s2.tx_guid = t.guid
join accounts a2 on a2.guid = s2.account_guid
where a.name = 'Checking Account' and t.post_date > '2012-02-29'
order by t.post_date desc

これらのモデルを使用して

class Account(db.Model):
    __table__ = db.Table('accounts', db.metadata, autoload=True, autoload_with=db.engine)
    splits = db.relationship('Split', backref='account')

class Transaction(db.Model):
    __table__ = db.Table('transactions', db.metadata, autoload=True, autoload_with=db.engine)
    splits = db.relationship('Split', backref='transaction')

class Split(db.Model):
    __table__ = db.Table('splits', db.metadata,
                          db.Column('tx_guid', db.VARCHAR, db.ForeignKey('transactions.guid')),
                          db.Column('account_guid', db.VARCHAR, db.ForeignKey('accounts.guid')),
                          autoload=True, autoload_with=db.engine)

私はここまで来ましたが、今は立ち往生しています

q = Split.query.join(Transaction). \
                join(Account). \
                options(db.joinedload(Split.transaction)). \
                options(db.joinedload(Split.account)). \
                filter(Account.name == 'Checking Account'). \
                filter(Transaction.post_date > date(2012, 02, 29)). \
                order_by(db.desc(Transaction.post_date))

joinトランザクション分割して残し、次にそれらの分割accountsに残すにはどうすればよいですか? つまり、上記のクエリの最後の 2 つの結合です。

4

1 に答える 1

2

クエリで同じテーブルを複数回参照する場合は、 aliased()コンストラクトを使用する必要があります。

s = db.aliased(Split)
a = db.aliased(Account)
q = db.session.query(Split).\
    options(joinedload(Split.transaction)).\
    options(joinedload(Split.account)).\
    join(Transaction).\
    join(Account).\
    outerjoin(s, Transaction.splits).\
    join(a, a.guid == s.account_guid).\
    filter(Account.name == 'Checking Account').\
    filter(Transaction.post_date > date(2012, 2, 29)).\
    order_by(Transaction.post_date.desc())

また、INNER 結合と OUTER 結合を混在させる場合は注意してください。

于 2013-07-20T11:23:19.743 に答える