Geo*_*che 2 python orm sql-order-by pony ponyorm
我尝试用小马orm中的order_by聚合实现一个简单的选择:
因此,我尝试了以下方法:第一种方法引发错误消息:
sel = select((f.Name, f.id) for f in Firma).order_by(Firma.Name)
Run Code Online (Sandbox Code Playgroud)
这样,我从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])
Run Code Online (Sandbox Code Playgroud)
结果如下:
=== 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
Run Code Online (Sandbox Code Playgroud)
但是字典是:
dic {'Testfirma': 9, 'Quelle': 3, 'C': 12, 'The Pearlfactory': 8, 'B': 11, 'Otto': 6, 'A': 10, 'Neckermann': 7}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:在没有此错误消息的情况下,如何使用第一种order_by聚合方法。或者,如何将公司ID和公司名称的值放在排序后的字典中
我希望有人能听懂我的英语;)
问候
尼瑟尔
关于第一个问题,如果查询选择了元组,则可以通过指定元组项的数量对其进行排序:
query = select((f.Name, f.id) for f in Firma).order_by(1)
Run Code Online (Sandbox Code Playgroud)
在这里,1是指“按第一个元组项目(即,按Name升序)排序”。-2相反,如果指定,则表示“按第二个元组项(即,按id降序排列)”。
另一种方法是在order_by部分中指定lambda函数:
query = select((f.Name, f.id) for f in Firma).order_by(lambda: f.Name)
Run Code Online (Sandbox Code Playgroud)
或者,例如:
query = select((f.Name, f.id) for f in Firma).order_by(lambda: desc(f.id))
Run Code Online (Sandbox Code Playgroud)
请注意,我使用不带任何参数的lambda函数。以这种形式,flambda内部将引用f生成器表达式内部的变量。请注意,IDE无法理解该语法,可能会将其突出显示为错误,但是代码实际上是正确的。
您使用lambda函数查询看起来不正确:
Firma.select(lambda f: f.Name).order_by((Firma.Name))
Run Code Online (Sandbox Code Playgroud)
在该查询,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)
Run Code Online (Sandbox Code Playgroud)
如果所有数据处理都在内部进行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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1315 次 |
| 最近记录: |