【发布时间】:2021-12-20 08:22:56
【问题描述】:
使用:Django==2.2.24,Python=3.6,PostgreSQL 是底层 DB
使用 Django ORM,我可以轻松地进行各种查询,但我开始使用 Metabase,我的 SQL 可能有点生疏。
问题:
我正在尝试获取列表中项目的计数,在字典中的键下,存储为JSONField:
from django.db import models
from jsonfield import JSONField
class MyTable(models.Model):
data_field = JSONField(blank=True, default=dict)
存储在data_field中的字典示例:
{..., "my_list": [{}, {}, ...], ...}
在"my_list" 键下,存储的值是一个列表,其中包含许多其他字典。
在 Metabase 中,我试图计算列表中字典的数量,但更基本的东西,都不起作用。
我尝试过的一些东西:
尝试:
SELECT COUNT(elem->'my_list') as my_list_count
FROM my_table, json_object_keys(data_field:json) AS elem
错误:
ERROR: syntax error at or near ":" Position: 226
尝试:
SELECT ARRAY_LENGTH(elem->'my_list') as my_list_count
FROM my_table, JSON_OBJECT_KEYS(data_field:json) AS elem
错误:
ERROR: syntax error at or near ":" Position: 233
尝试:
SELECT JSON_ARRAY_LENGTH(data_field->'my_list'::json)
FROM my_table
错误:
ERROR: invalid input syntax for type json Detail: Token "my_list" is invalid. Position: 162 Where: JSON data, line 1: my_list
尝试:
SELECT ARRAY_LENGTH(JSON_QUERY_ARRAY(data_field, '$.my_list'))
FROM my_table
错误:
ERROR: function json_query_array(text, unknown) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts. Position: 140
基本上,我认为问题在于我在尝试使用的方法中使用了错误的签名(大部分时间)。
我使用这个查询来确保我至少可以从字典中获取键:
SELECT JSON_OBJECT_KEYS(data_field::json)
FROM my_table
如果不添加 ::json 演员表,我无法使用 JSON_OBJECT_KEYS(),我收到了这个错误:
ERROR: function json_object_keys(text) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts. Position: 127
但是使用 json 转换,我可以按预期获得所有键。
感谢您的关注!
编辑:
我也发现了这个interesting article with different solution,但没有一个解决方案有效。
还看到了this SO post,但没有帮助。
【问题讨论】:
标签: sql django postgresql metabase