Python:用小马orm

问题描述 投票:0回答:1

我尝试通过小马orm中的order_by聚合来实现一个简单的选择:

,我尝试采取方法: 第一种方式引起错误消息:

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

在这样,我从python那里获取错误消息:“ notimplemplededError:按属性进行订购仅限于查询,这些查询返回简单的对象列表。尝试使用其他形式的订购形式(tuple元素编号或成熟的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}

现在问题:我如何使用此错误消息的第一个订单_by聚合的方法。 或者,我如何在分类的Soccesion中将公司ID和公司名称的价值放在词典中?

python orm sql-order-by ponyorm
1个回答
7
投票
标记第一个问题,如果查询选择元组,则可以通过指定元组数量来订购它:

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

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函数而没有任何参数。在这种形式中,
f
内部lambda内部将参考发电机表达式内部的变量。请注意,IDE不了解该语法,并且可以将其强调为错误,但是代码实际上是正确的。 lankda功能的查询看起来不正确:

f
在该查询中,
Firma.select(lambda f: f.Name).order_by((Firma.Name))

内部

lambda

用于过滤,它只是过滤对象,这些对象不是空的。
向您提出第二个问题,在Python词典中是无序的。如果您想保留物品的顺序,则不应将它们保存在字典中。使用列表:

select

如果您的所有数据处理都发生在
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

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.