我尝试用小马ORM中的order_by聚合来实现一个简单的选择:
所以,我尝试采取方法:第一种引起错误消息:
sel = select((f.Name, f.id) for f in Firma).order_by(Firma.Name)
以这种方式,我从python获取错误消息:" notimplementedError:按属性订购仅限于查询,这些查询返回简单的对象列表。尝试使用其他形式的订购(通过Tuple Element号码或成熟的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和公司名称的价值放在分类的soccesion
中我希望有人能理解我的可怕英语;(
问候
niesel
关于您的第一个问题,如果查询选择元组,则可以通过指定元组数量来订购它:
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
内部用于过滤的CC_8,它只是过滤对象的名称不是空的。
关于您的第二个问题,在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)