0

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 不支持这个,还是我做错了什么?

4

2 回答 2

1

此问题已在 中解决0.7.3

于 2017-08-25T17:00:20.603 回答
0

评论:导致 Pony 引发异常:
“TypeError: Function 'int' cannot be used this way: 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'])

用纯 Python给我没有错误。

Pony ORM:数据库中的JSON 支持
为了在数据库中存储 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。

于 2017-08-15T13:10:06.157 回答