当前位置: 首页 > 面试题库 >

SQLAlchemy:如何对关系字段上的查询结果(order_by)进行排序?

曾嘉祯
2023-03-14
问题内容
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的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。


问题答案:

SQLAlchemy希望您考虑SQL。如果您查询“基本”,则为:

SELECT * FROM base

简单。那么,在SQL中,如何从“基本”中选择行,并按完全不同的表(即“玩家”)中的“名称”列进行排序?您使用联接:

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)


 类似资料:
  • 问题内容: 这是我当前模型的简化示例(我正在使用Flask SQLAlchemy扩展): 我正在尝试按喜欢的次数订购。 这是我基本上想发出的查询: 我只是无法在SQLAlchemy方面进行任何工作。 感谢您提供任何帮助。 问题答案: 我没有使用SQLAlchemy,所以我想尝试一下。我没有尝试使用你的模型,我只是写了一些新模型(尽管足够类似): 你想要加入likes表格,用于func.count计

  • 我需要按字段“priority”(定义为文本)对bucket进行排序,但我不知道该怎么做。 你介意帮我做这件事吗? 我尝试过bucket_sort,但ES给出了一个关于类型的错误,与sort和order相同。 这是聚合查询 结果示例如下: 我想按索引中定义为文本的字段“优先级”对存储桶聚合(asc/desc)进行排序

  • 问题内容: 在对mysql查询进行排名时如何处理联系?在此示例中,我简化了表名和列,但它可以说明我的问题: 因此,假设上面的查询产生了: 即使Al和Amy的成绩相同,一个人的排名也比另一个高。艾米被偷走了。我如何才能使Amy和Al具有相同的排名,以使他们俩的排名都为1。而且,William和Mary没有参加考试。他们挤在教室里,在男孩的房间里抽烟。他们应该并列最后的位置。 正确的排名应该是: 如果

  • 我正在编写一个Spring Boot APIendpoint,我需要返回一个航空公司列表,该列表按3个或更多字符的字符串(描述)排序,列表的结果必须与顶部单词开头的字符串相匹配,其余的按字母顺序排序 我得到了与字符串匹配的列表,但我无法获得正确的顺序 如果我搜索关键词“ala”,所有以“ala”开头的航空公司都应该排在第一位。 这就是我得到的

  • 这是我的密码。我做错了什么?我想在RecyclerView中显示降序结果。

  • 主要内容:单字段排序,多字段排序通过条件查询语句可以查询到符合用户需求的数据,但是查询到的数据一般都是按照数据最初被添加到表中的顺序来显示。为了使查询结果的顺序满足用户的要求,MySQL 提供了 ORDER BY 关键字来对查询结果进行排序。 在实际应用中经常需要对查询结果进行排序,比如,在网上购物时,可以将商品按照价格进行排序;在医院的挂号系统中,可以按照挂号的先后顺序进行排序等。 ORDER BY 关键字主要用来将查询结果中