Pony ORM order_by целочисленное значение json

Похоже, что 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 не поддерживает это или я делаю что-то не так?


person freebie    schedule 14.08.2017    source источник
comment
Попробуйте lambda p: int(p.body['age']).   -  person stovfl    schedule 14.08.2017
comment
Вы пробовали это? Я почти уверен, что пытался сделать это раньше и получил сообщение об ошибке, хотя сейчас не за компьютером, чтобы проверить   -  person freebie    schedule 15.08.2017


Ответы (2)


Эта проблема была решена в 0.7.3.

person freebie    schedule 25.08.2017

Комментарий: вызывает Pony и исключение:
"TypeError: Функция '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, а документация json – это str.
Обходной путь:

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

дает мне NO Error с чистым 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 может работать с JSON в SQLite и без этого модуля.

person stovfl    schedule 15.08.2017
comment
Таким образом, изменение строки на .order_by(lambda p: int(p.body['age'])) приводит к возникновению Pony и исключению: TypeError: Функция 'int' не может использоваться таким образом: int(p.body['age']) - person freebie; 15.08.2017
comment
Кажется, он ведет себя при использовании оператора select, например. select(lambda p: p.body['age'] > 1) — как в документации Pony. Это заставляет меня чувствовать, что это ошибка. Однако у меня нет подтверждения на страницах проблем github. - person freebie; 15.08.2017
comment
@freebie: обновил мой ответ - person stovfl; 15.08.2017