【问题标题】:How to query on a JSON-type field with SQLAlchemy?如何使用 SQLAlchemy 查询 JSON 类型的字段?
【发布时间】:2015-10-26 13:38:56
【问题描述】:

这只是一个简单的例子。

field = [[1,12,6], [2,12,8]]

我考虑在 sqlite3 数据库中使用 SQLAlchemy 将其存储在 json 类型的字段中。

但是我如何使用 SQLAlchemy(不是 SQL)来查询呢? 例如

  • len(field) 为 3 的行
  • field[1][2] 不是 12 的行
  • len(field[*]) 不是 3 的行
  • 按字段分组[2]
  • sum field[1] where field[0] is 1

有可能吗?

也许使用经典的多对多表(包括链接表)而不是 json-field 更容易实现这一点?

【问题讨论】:

    标签: json sqlite sqlalchemy


    【解决方案1】:

    根据官方文档,这些是 SQLAlchemy 为 JSON 字段提供的可用方法。

    JSON 提供了几种操作:

    索引操作:

    data_table.c.data['some key']
    

    返回文本的索引操作(文本比较所需):

    data_table.c.data['some key'].astext == 'some value'
    

    使用内置 CAST 调用的索引操作:

    data_table.c.data['some key'].cast(Integer) == 5
    

    路径索引操作:

    data_table.c.data[('key_1', 'key_2', ..., 'key_n')]
    

    返回文本的路径索引操作(文本比较需要):

    data_table.c.data[('key_1', 'key_2', ..., 'key_n')].astext == \
    'some value'
    

    http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#sqlalchemy.dialects.postgresql.JSON

    根据我对 PostgreSQL 中 JSON 类型的了解,最好仅在您想要整个 JSON 对象时使用它。如果要对 JSON 对象的字段进行类似 SQL 的操作,那么最好使用经典的 SQL 关系。这是我发现的一个来源说同样的话,但还有更多。 http://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary-jsonhstore-dynamic-columns/

    【讨论】:

    • 这不适用于问题要求的 sqlite3。
    • 这是两岁了。提问者接受它作为最佳答案,我想我只是专注于 postgresql,因为它是 SQLAlchemy 支持 JSON 的唯一数据库。我在底部的最后一段在技术上仍然是正确的,如果您想查询 JSON,最好将其转换为 SQL 关系。这可能就是为什么它被接受的原因,尽管没有提到 sqlite。 docs.sqlalchemy.org/en/latest/core/…
    • 我昨天试图找到一种方法在 sqlite 中进行索引。缺乏官方支持并不是停止黑客攻击的理由。 gist.github.com/brthor/e3d23ae549ee53cdea56d72d39ad1288
    猜你喜欢
    • 2017-04-04
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2014-05-28
    • 1970-01-01
    • 2019-10-18
    • 2023-03-13
    相关资源
    最近更新 更多