Как я могу получить доступ к последнему индексу ArrayField в запросе peewee с postgres? - PullRequest
0 голосов
/ 13 января 2020

У меня есть модель с полем 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, но безуспешно.

Есть какие-нибудь рекомендации здесь?

1 Ответ

0 голосов
/ 13 января 2020

Вы, вероятно, должны индексировать, используя выражение типа fn.array_upper(Test.value, 1), как вы указали.

Исправлено 55ef182840f869f63 в master, будет доступно в следующем выпуске.

...