如何使用SQLAlchemy查询JSON类型的字段?

buh*_*htz 5 sqlite json sqlalchemy

这只是一个简单的例子。

field = [[1,12,6], [2,12,8]]
Run Code Online (Sandbox Code Playgroud)

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

但是,如何使用SQLAlchemy(而非SQL)对此进行查询?例如

  • len(field)为3的行
  • 字段[1] [2]不为12的行
  • len(field [*])不为3的行
  • 按领域分组[2]
  • 对field [1]求和,其中field [0]为1

可能吗?

也许用经典的多对多表(包括链接表)而不是json-field来简化这一过程会更容易吗?

Apo*_*ine 6

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

JSON 提供了几种操作:

索引操作:

data_table.c.data['some key']
Run Code Online (Sandbox Code Playgroud)

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

data_table.c.data['some key'].astext == 'some value'
Run Code Online (Sandbox Code Playgroud)

带有内置 CAST 调用的索引操作:

data_table.c.data['some key'].cast(Integer) == 5
Run Code Online (Sandbox Code Playgroud)

路径索引操作:

data_table.c.data[('key_1', 'key_2', ..., 'key_n')]
Run Code Online (Sandbox Code Playgroud)

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

data_table.c.data[('key_1', 'key_2', ..., 'key_n')].astext == \
'some value'
Run Code Online (Sandbox Code Playgroud)

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/

  • 这是两岁了。提问者接受了它作为最佳答案,我想我只关注 postgresql 因为它是 SQLAlchemy 唯一支持 JSON 的数据库。我在底部的最后一段在技术上仍然是正确的,如果您希望在 JSON 上查询,最好将其转换为 SQL 关系。这可能就是为什么它被接受的原因,尽管没有提到 sqlite。http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.JSON (2认同)