Пони ORM order_by JSON интегральное значение

Пони 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.7.3,

Комментарий: вызывает повышение пони и исключение:
"Ошибка типа: функция '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'])

не дает мне ошибки с чистым 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 даже без этого модуля.

Другие вопросы по тегам