web-dev-qa-db-ja.com

SQLAlchemy:リレーションシップのフィールドでクエリ結果(order_by)を並べ替える方法

モデル

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey
from sqlalchemy import Integer
from sqlalchemy import Unicode
from sqlalchemy import TIMESTAMP
from sqlalchemy.orm import relationship

BaseModel = declarative_base()

class Base(BaseModel):
   __tablename__ = 'base'
   id = Column(Integer, primary_key=True)
   location = Column(Unicode(12), ForeignKey("locationterrain.location"), unique=True,)
   name = Column(Unicode(45))
   ownerid =  Column(Integer,ForeignKey("player.id"))
   occupierid =  Column(Integer, ForeignKey("player.id"))
   submitid =  Column(Integer,ForeignKey("player.id"))
   updateid =  Column(Integer,ForeignKey("player.id"))
   owner = relationship("Player",
         primaryjoin='Base.ownerid==Player.id',
         join_depth=3,
         lazy='joined')
   occupier= relationship("Player",
         primaryjoin='Base.occupierid==Player.id',
         join_depth=3,
         lazy='joined')
   submitter = relationship("Player",
         primaryjoin='Base.submitid== Player.id',
         join_depth=3,
         lazy='joined')
   updater= relationship("Player",
         primaryjoin='Base.updateid== Player.id',
         join_depth=3,
         lazy='joined')


class Player(BaseModel):
   __tablename__ = 'player'
   id = Column(Integer, ForeignKey("guildmember.playerid"), primary_key=True)
   name =  Column(Unicode(45))

探す

bases = dbsession.query(Base)
bases = bases.order_by(Base.owner.name)

これは動作しません....私はどこでも検索してドキュメントを読みました。しかし、自分の(ベース)クエリを「所有者」関係の名前でどのように並べ替えるかがわかりません。

常に次の結果になります。

 AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name'

これは簡単なはずですが...わかりません。論理的に見えるコンパレータも調べましたが、すべてが動的に生成されるため、ORDER BYのクエリ部分が生成される場所や、何を返す必要があるのか​​わかりません。そして、単純なことをするために私の「プレーヤー」関係のそれぞれに対してコンパレーターを作ることは、複雑すぎるようです。

24
The Pjot

SQLAlchemyは、SQLの観点から考えることを求めています。 「ベース」のクエリを実行すると、次のようになります。

SELECT * FROM base

簡単です。では、SQLでは、「base」から行を選択し、まったく別のテーブル、つまり「player」の「name」列で並べ替える方法を教えてください。結合を使用します:

SELECT base.* FROM base JOIN player ON base.ownerid=player.id ORDER BY player.name

SQLAlchemyは同じ思考プロセスを使用します-あなたはjoin()です:

session.query(Base).join(Base.owner).order_by(Player.name)
38
zzzeek