Python:使用Pony ORM进行简单排序

时间:2017-04-27 18:11:56

标签: python orm sql-order-by pony ponyorm

我尝试在pony orm中使用order_by聚合实现一个简单的选择:

所以,我尝试了方法: 第一种方式引发错误消息:

sel = select((f.Name, f.id) for f in Firma).order_by(Firma.Name)

通过这种方式,我从python中收到错误消息:“NotImplementedError:按属性排序仅限于返回简单对象列表的查询。尝试使用其他形式的排序(通过元组编号或完整的lambda expr) )“

第二种方式,选择顺序正常,但在我的字典中插入会破坏患病的选择顺序

            for f in Firma.select(lambda f: f.Name) \
                .order_by((Firma.Name)):
            dic[f.Name] = f.id
            print ("=== f.Name", f.Name)
            dic[f.Name] = f.id
            print(" === dic[f.Name]", dic[f.Name])

结果如下:

    === f.Name A
 === dic[f.Name] 10
=== f.Name B
 === dic[f.Name] 11
=== f.Name C
 === dic[f.Name] 12
=== f.Name Neckermann
 === dic[f.Name] 7
=== f.Name Otto
 === dic[f.Name] 6
=== f.Name Quelle
 === dic[f.Name] 3
=== f.Name Testfirma
 === dic[f.Name] 9
=== f.Name The Pearlfactory
 === dic[f.Name] 8

但字典是:

dic  {'Testfirma': 9, 'Quelle': 3, 'C': 12, 'The Pearlfactory': 8, 'B': 11, 'Otto': 6, 'A': 10, 'Neckermann': 7}

现在的问题:如何使用order_by聚合的第一种方式,而不是这条错误消息。 或者,我如何在已排序的社会中将公司ID和公司名称的值放在我的字典中

我希望有人能理解我可怕的英语;)

问候

niesel

1 个答案:

答案 0 :(得分:5)

关于您的第一个问题,如果查询选择元组,您可以通过指定元组项的数量来订购:

query = select((f.Name, f.id) for f in Firma).order_by(1)

此处,1表示“按升序排序第一元组项(即Name)”。相反,如果您指定-2,则表示“按第二元组项(按id排序)按降序排序”。

另一种方法是在order_by部分中指定lambda函数:

query = select((f.Name, f.id) for f in Firma).order_by(lambda: f.Name)

或者,例如:

query = select((f.Name, f.id) for f in Firma).order_by(lambda: desc(f.id))

请注意,我使用没有任何参数的lambda函数。在该形式中,lambda内的f将引用生成器表达式中的变量f。请注意,IDE不理解该语法,可能会将其突出显示为错误,但代码实际上是正确的。

使用lambda函数的查询看起来不正确:

Firma.select(lambda f: f.Name).order_by((Firma.Name))

在该查询中,lambda位于用于过滤的select内,它只过滤名称不为空的对象。

关于你的第二个问题,Python中的词典是无序的。如果您想保留项目的顺序,则不应将它们保留在字典中。改为使用列表:

query = select((f.Name, f.id) for f in Firma).order_by(1)
name_id_pairs = query[:]  # retrieve result list from a query
# another form: name_id_pairs = list(query)

for name, id in name_id_pairs:
    print('Name:', name, ', id:', id)

如果所有数据处理都在db_session内进行(建议使用),则可以从查询中检索对象而不是元组:

query = select(f for f in Firma).order_by(lambda: f.name)
firms = list(query)
for f in firms:
    print('Name:', f.name, ', id:', f.id)