【问题标题】:SqlAlchemy: Querying the length json field having an arraySqlAlchemy:查询具有数组的长度 json 字段
【发布时间】:2014-05-28 10:08:49
【问题描述】:

我有一个带有 JSON 类型字段的表。 JSON 字段包含一个带有数组的 JSON 对象。如何查询这个数组每一行的长度?

class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    items = Column(JSON)

此表中的示例行:

id: 1, items: [2,3,5]
id: 2, items: [2,3,5, 8, 12]
id: 3, items: [2,5]
id: 4, items: []

预期结果:

1 3
2 5
3 2
4 0

有没有这样的:

session.query(Post.id, len(Post.items))

注意:JSON 字段包含一个复杂对象的数组,我在这里使用整数只是为了说明。

【问题讨论】:

    标签: postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    找到解决办法

    创建一个像这样扩展 FunctionElement 的类

    from sqlalchemy.sql.expression import FunctionElement
    from sqlalchemy.ext.compiler import compiles
    class json_array_length(FunctionElement):
        name = 'json_array_len'
    
    @compiles(json_array_length)
    def compile(element, compiler, **kw):
        return "json_array_length(%s)" % compiler.process(element.clauses)
    

    并像这样使用它

    session.query(Post.id, json_array_length(Post.items))
    

    注意:这将适用于 postgres,因为其中定义了函数 'json_array_length'。如果您希望将其用于不同的数据库,则该功能将需要更改。 参考http://docs.sqlalchemy.org/en/rel_0_9/core/compiler.html#further-examples

    【讨论】:

    • 这是一个如此简单的概念所需要的,这太疯狂了,但我想这就是我们为抽象付出的代价。也适用于jsonb_array_length,这正是我所需要的——非常感谢!
    • 如果是 mysql alchemy,请将方法名称更改为 json_length,它工作正常
    【解决方案2】:

    一个更简单的解决方案,使用sqlalchemy.sql.expression.func 对象:

    session.query(Post.id, func.json_array_length(Post.items))
    

    来自文档:

    func 是一个特殊的对象实例,它根据基于名称的属性生成 SQL 函数

    ...

    任何名字都可以给func。如果 SQLAlchemy 不知道函数名称,它将完全按原样呈现。

    来源:http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2016-04-08
      • 2020-10-08
      相关资源
      最近更新 更多