2016-05-23 4 views
0

私は今PythonでSQLAlchemyを使用してgroup_byクエリを実行する方法は?

class Shelter(Base): 

    __tablename__ = 'shelter' 
    id = Column(Integer, primary_key = True) 
    name = Column(String(80), nullable = False) 
    address = Column(String(250)) 
    city = Column(String(80)) 
    state = Column(String(20)) 
    zipCode = Column(String(10)) 
    website = Column(String) 


class Puppy(Base): 

    __tablename__ = 'puppy' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(250), nullable=False) 
    gender = Column(String(6), nullable = False) 
    dateOfBirth = Column(Date) 
    picture = Column(String) 
    shelter_id = Column(Integer, ForeignKey('shelter.id')) 
    shelter = relationship(Shelter) 
    weight = Column(Numeric(10)) 

、その下に提供される2つのテーブルがすでに移入されていて、私はPythonのを使って自分のシェルター名前ですべての子犬のグループを取得するためのクエリを作成したいと思います。したがって、puppyName puppyShelterNameとして印刷する必要があります。

私は私が欲しかったので、これは明らかに動作していない

puppies = session.query(Puppy).group_by(Puppy.shelter_id).all() 

for puppy in puppies: 
    puppy.name 

、以下のようなコードを記述します。避難所がどこに滞在しているかによって、すべての子犬の名前を避難所の名前のグループに印刷したいと思います。どのようにコードを修正するには?

+0

どのようなDBですか?たとえば、PostgreSQLでは、['array_agg()'](http://www.postgresql.org/docs/current/static/functions-aggregate.html)で集計することができます。 –

+0

'sqlite'を使って、' engine = create_engine( 'sqlite:///puppyshelter.db') ' – Arefe

+1

という名前で始めました。グループ化する必要はありません。これは本当の問題の単純化ですか? –

答えて

2

追加情報から、ORDER BYで十分です。

class Puppy(Base): 
    ... 
    shelter = relationship(Shelter, backref='puppies') 
を:あなたはあなたの関係でbackrefsを持っていた場合にも、少し違っこれを行うことが

results = session.query(Puppy.name, Shelter.name)\ 
     .join(Shelter).order_by(Shelter.name, Puppy.name).all() 

for puppy, shelter in results: 
    print(puppy, shelter) # or `print puppy, shelter` if on PY2 

:モデルはまた、両方の子犬の名前や避難所の名前をプリントアウトするために参加する必要があります

その後、最初にすべてのシェルターを選択してから、バックリファレンスを使用して子犬を反復することができます。バックリファレンスがどのように設定されているかに応じて、単一のクエリを発行するか、Shelterのすべてを選択し、シェルターごとに選択してPuppyインスタンスをフェッチします。

from sqlalchemy.orm import joinedload 

shelters = session.query(Shelter).options(joinedload('puppies')).all() 
for shelter in shelters: 
    for puppy in shelter.puppies: 
     print(puppy.name, shelter.name) 
関連する問題