如何在Python中使用SQLAlchemy按查询分组?

2024-10-01 07:40:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个表,如下所示,它们已经被填充

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))

现在,我想用Python编写一个查询,通过它们的庇护所名称获取所有小狗组。因此,需要将其打印为puppyName puppyShelterName。在

我写的代码如下

^{pr2}$

这显然不是我想要的。我想打印所有的小狗的名字和他们的庇护所的名称组,根据他们所住的庇护所。如何更正代码?在


Tags: keyidfalsetruebasestringcolumninteger
1条回答
网友
1楼 · 发布于 2024-10-01 07:40:09

从提供的附加信息来看,ORDER BY似乎就足够了。为了打印出小狗的名字和庇护所的名字,还需要加入模型:

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

如果你的关系中有反证的话,你也可以做一些不同的事情:

^{pr2}$

然后您可以首先选择所有的避难所,然后使用backref遍历小狗。根据backref配置的急切程度,它要么发出一个查询,要么对所有Shelter发出一个select,然后对每个避难所执行一个select,以获取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)

相关问题 更多 >