【问题标题】:Python: Simple order by with Pony ORMPython:使用 Pony ORM 进行简单排序
【发布时间】:2017-04-27 18:11:55
【问题描述】:

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

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

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

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

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

            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 和公司名称的值放在排序后的字典中

我希望有人能理解我糟糕的英语;)

问候

尼塞尔

【问题讨论】:

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


    【解决方案1】:

    关于您的第一个问题,如果查询选择元组,您可以通过指定元组项的数量对其进行排序:

    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))
    

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

    关于第二个问题,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)
    

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多