Применение array_agg к столбцу Enum возвращает "" {"нет среди определенных значений enum" - PullRequest
2 голосов
/ 18 октября 2019

Для моего проекта я использую Postgres DB и SQLAlchemy в качестве ORM. Я определил несколько перечислений, которые мы используем в разных моделях.

У меня определено перечисление

class TestEnum(MultiValuedEnum):
   STATE1 = 'state-1', (
        'State 1', 'Waiting state 2')

   STATE2 = 'state-2', (
        'State 2', 'In state 2')

   STATE3 = 'state-3', (
        'State 3', 'In state 3')

    @property
    def display_name(self):
        return self.metadata[0]

    @property
    def description(self):
        return self.metadata[1]

Это перечисление используется в классе

class ExampleClass(db.Model):
    id = db.Column(db.BigInteger, primary_key=True, nullable=False)
    product_id = db.Column(db.BigInteger, nullable=False)
    state = db.Column(db.Enum(constants.TestEnum), nullable=False)

Теперь, если я напишу запрос

query = session.query(
        ExampleClass.product_code,
        func.array_agg(ExampleClass.state)
    ).group_by(ExampleClass.product_code).all()

Я получаю следующую ошибку

"{" не входит в число определенных значений перечисления

Если я запускаю сгенерированный запрос в dbeaver (перехватывается с помощью sqltap ), я получаю правильный результат, и он выглядит так

+---+------------+----------------+
|   |product_code|      State     |
+---+------------+----------------+
| 1 | A          |{STATE1,STATE2} |
| 2 | B          |{STATE2,STATE3} |
| 3 | C          |{STATE1,STATE3} |
+---+------------+----------------+

Кажется, что SQL Alchemy пытается проанализировать список состояний для объекта State и не работает из-за { в начале, обозначая его как список, я полагаю. Если он не преобразует его в Список состояний, почему я получаю эту ошибку и что за исправление или обходной путь.

array_agg нормально работает с другими полями в проекте, и я могу перебрать возвращенный массив, но для ENUM он не работает. Спасибо

1 Ответ

1 голос
/ 18 октября 2019

Итак, пробуя разные вещи, я пробовал json_agg, и, похоже, это работает. Так что теперь мой запрос выглядит как

query = session.query(
        ExampleClass.product_code,
        func.json_agg(ExampleClass.state)
    ).group_by(ExampleClass.product_code).all()

И, похоже, он возвращает мне ENUMS в виде списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...