对于我的项目,我使用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似乎可以在项目中的其他字段上正常工作,并且我可以循环返回的Array,但是对于ENUM来说似乎失败了。 谢谢
答案 0 :(得分:1)
因此,在尝试其他操作时,我尝试使用json_agg
,但似乎可行。所以现在我的查询看起来像
query = session.query(
ExampleClass.product_code,
func.json_agg(ExampleClass.state)
).group_by(ExampleClass.product_code).all()
似乎以列表的形式返回了ENUMS。