微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决SQLAlchemy:如何对关系字段上的查询结果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)

解决方法

楷模

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',lazy='joined')
   submitter = relationship("Player",primaryjoin='Base.submitid== Player.id',lazy='joined')
   updater= relationship("Player",primaryjoin='Base.updateid== Player.id',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的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。