Для моего проекта я использую 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 он не работает. Спасибо