Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 链联接关系中的按列排序_Python_Sqlalchemy_Sql Order By_Relation - Fatal编程技术网

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将不起作用的建议替换为起作用的建议。上述评论不再适用。新代码已经过测试。