У меня есть модель с полем Array, и я хотел бы найти записи, в которых последний элемент поля больше известного значения. Поле массива будет содержать массивы различной длины.
Я думал, что использовать что-то вроде Test.select().where(known_value <= Test.array_field[-1])
для модели {Test} будет работать, но что {-1} не работает должным образом. Вот минимальный рабочий пример:
from os import path, environ
import peewee as pw
from playhouse.postgres_ext import ArrayField
from db_stuff import connect, get_database
class Test(pw.Model):
# note an 'id' primary key field will be created by peewee by default
value = ArrayField(pw.IntegerField)
class Meta:
table_name = 'test2'
# connects the model to the database and returns the instance, details are
# unimportant
connect('test_db_login.json', [Test])
database = get_database()
database.create_tables([Test])
Test.create(value=[1,2,3,4])
Test.create(value=[5,6,7,8])
known_value = 6
for entry in Test.select():
# outputs both records
print('id', entry.id, 'value', entry.value)
for entry in Test.select().where(Test.value[0] <= known_value):
# outputs both records
print('id', entry.id, 'value', entry.value, 'first value', entry.value[0])
for entry in Test.select().where(known_value <= Test.value[-1]):
# outputs nothing
print('id', entry.id, 'value', entry.value, 'last value', entry.value[-1])
Когда я пытаюсь выполнить необработанный запрос sql к таблице, все работает как положено: SELECT "t1"."id", "t1"."value" FROM "test2" AS "t1" WHERE ("t1"."value"[ARRAY_UPPER("t1"."value", 1)] >= 6);
, возвращая вторую запись.
Я посмотрел вокруг кода в peewee и искал в интернете механизм с такой функциональностью, как ARRAY_UPPER
в peewee, но безуспешно.
Есть какие-нибудь рекомендации здесь?