【问题标题】:Applying array_agg on Enum column returns ""{" is not among the defined enum values"在枚举列上应用 array_agg 将返回“”{“不在定义的枚举值中”
【发布时间】:2019-10-18 07:08:18
【问题描述】:

对于我的项目,我使用 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,它似乎失败了。 谢谢你

【问题讨论】:

    标签: python sql postgresql enums sqlalchemy


    【解决方案1】:

    所以,在尝试不同的事情时,我尝试了json_agg,它似乎有效。所以现在我的查询看起来像

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

    它似乎以列表的形式向我返回 ENUMS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多