Python 链联接关系中的按列排序
在我的应用程序中,我有这样的模型:Python 链联接关系中的按列排序,python,sqlalchemy,sql-order-by,relation,Python,Sqlalchemy,Sql Order By,Relation,在我的应用程序中,我有这样的模型: A类(基本): id=列(UUID,主键=True) 名称\u a=列(文本) B类(基本类): id=列(UUID,主键=True) name_b=列(文本) parent_a_id=列(UUID,ForeignKey(a.id)) 父项a=关系(a,lazy='joined') C类(基本类): id=列(UUID,主键=True) name_c=列(文本) parent_b_id=列(UUID,ForeignKey(b.id)) 父项b=关系(b,la
A类(基本):
id=列(UUID,主键=True)
名称\u a=列(文本)
B类(基本类):
id=列(UUID,主键=True)
name_b=列(文本)
parent_a_id=列(UUID,ForeignKey(a.id))
父项a=关系(a,lazy='joined')
C类(基本类):
id=列(UUID,主键=True)
name_c=列(文本)
parent_b_id=列(UUID,ForeignKey(b.id))
父项b=关系(b,lazy='joined')
当我这样做时:
DBSession().query(C).all()
它工作得很好-我在一个左外部联接查询中得到了所有C名称,其中包含B和A名称
但是我想知道如何通过以下查询来排序:名称a、名称b、名称c
我试着做一些类似的事情:
DBSession().query(C).order_by(
C.父母b.父母a.姓名a,
C.家长姓名,
C.姓名
).all()
这样的代码不起作用。如何使用sqlalchemy spirit实现这一点?我使用了您的示例,并使用PostgreSQL增加了分数 查询返回一个C对象列表,在SQL中,传统上只能按检索的列进行排序。这些关系是在幕后检索到的,所以我不明白为什么可以按它们排序 好的一面是,一旦检索到列表,它将在内存中包含整个层次结构,因此您可以在内存中快速排序:
clist = session.query(C).all()
sorted(clist, key=lambda c:(c.b.a.name, c.b.name, c.name))
我发现的另一个解决方案是使用order_by参数
表示关系
:
class B(Base):
...
a = relationship(A, order_by="A.name", lazy='joined')
class C(Base):
...
b = relationship(B, order_by="B.name", lazy='joined')
最终结果:
print (session.query(C).order_by(C.name) )
按tc.name、tb_1.name、ta_1.name排序
这与您想要的很接近,但您需要颠倒列表,以A.name、B.name、C.name
顺序获得它
p.S.:我的准确分类定义供参考:
#!/usr/bin/env python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, ForeignKey, create_engine, Text
from sqlalchemy.orm import relationship
engine_connect_str = "postgresql://postgres@MYSERV/mydb"
engine = create_engine(engine_connect_str, echo=False)
Session = sessionmaker(engine)
session = Session()
Base = declarative_base()
class A(Base):
__tablename__ = 'ta'
id = Column('id', Integer, primary_key=True)
name = Column(Text)
def __repr__(self):
return "{}(id={}, name='{}')".format(self.__class__.__name__, self.id, self.name)
class B(Base):
__tablename__ = 'tb'
id = Column('id', Integer,primary_key=True)
name = Column(Text)
a_id = Column('aid', ForeignKey(A.id), nullable=False)
a = relationship(A, order_by="A.name", lazy='joined')
def __repr__(self):
return "{}(id={}, name='{}', a_id={})".format(self.__class__.__name__, self.id, self.name, self.a_id)
class C(Base):
__tablename__ = 'tc'
id = Column('id', Integer, primary_key=True)
name = Column(Text)
b_id = Column('bid', ForeignKey(B.id), nullable=False)
b = relationship(B, order_by="B.name", lazy='joined')
def __repr__(self):
return "{}(id={}, name='{}', b_id={})".format(self.__class__.__name__, self.id, self.name, self.b_id)
@vac I将不起作用的建议替换为起作用的建议。上述评论不再适用。新代码已经过测试。