POM ORM order_by json积分值

时间:2017-08-14 10:56:38

标签: python json orm ponyorm

Pony ORM似乎按Json值的字符串排序,而不是整数值。有没有办法让这个订单正确?

以下是一个例子:

from pony.orm import (
    Database, Required, Optional, db_session, commit,
    show, Json)

db = Database()
db.bind('sqlite', filename=':memory:', create_db=True)

class Person(db.Entity):
    name = Required(str)
    body = Optional(Json, default={})

db.generate_mapping(create_tables=True)


with db_session:
    Person(name='bort', body={'age': 1})
    Person(name='baz', body={'age': 2})
    Person(name='bar', body={'age': 10})
    Person(name='foo', body={'age': 20})

    commit()

    people = Person.select().order_by(lambda p: p.body['age'])
    show(people)

输出:

id|name|body       
--+----+-----------
1 |bort|{'age': 1} 
3 |bar |{'age': 10}
2 |baz |{'age': 2} 
4 |foo |{'age': 20}

有没有办法解决这个问题,Pony ORM不支持这个,还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

此问题已在0.7.3中解决。

答案 1 :(得分:0)

  

评论:导致Pony加注和异常:
  " TypeError:Function' int'不能这样使用:int(p.body [' age'])"

无法通过pony验证,请尝试pony接受此信息:

def _int(v):
    return int(v)

people = Person.select().order_by(lambda p: _int(p.body['age']))
  

问题:有没有办法解决这个问题,Pony ORM不支持这个

您正在使用sqlite,关于文档jsonstr 解决方法:

lambda p: int(p.body['age'])

给了我 NO 纯Python的错误。

  

Pony ORM:JSON Support in Databases
  为了在数据库中存储JSON,Pony使用以下类型:

    SQLite - TEXT
    PostgreSQL - JSONB (binary JSON)
    MySQL - JSON (binary JSON, although it doesn’t have ‘B’ in the name)
    Oracle - CLOB
     

从版本3.9开始,SQLite提供了JSON1扩展模块。此扩展在使用JSON查询时提高了性能,尽管即使没有此模块,Pony也可以在SQLite中使用JSON。