【问题标题】:Extract JSON content in Metabase SQL query提取元数据库 SQL 查询中的 JSON 内容
【发布时间】:2021-12-20 08:22:56
【问题描述】:

使用:Django==2.2.24Python=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


    【解决方案1】:

    好的,经过一番挖掘,我找到了this 文章,它具有正确的格式/语法。

    这段代码是我用来成功从 JSON 对象中获取列表的代码:

    select data_field::json->'my_list' as the_list
    from my_table 
    

    然后,我用json_array_length()来获取元素个数:

    select json_array_length(data_field::json->'my_list') as number_of_elements
    from my_table 
    

    全部完成! :)

    编辑:
    我刚刚找到了整个恶作剧的原因。 在代码中(可以追溯到几年前)我们使用了这个包:

    jsonfield==1.0.3
    

    并以这种方式使用:

    from jsonfield import JSONField
    

    问题是在后台,Postgres 将数据保存为字符串,因此需要将其转换为 JSON。 后来Django引入了自己的JSONField,它按照你的预期存储数据,不需要强制转换:

    from django.contrib.postgres.fields import JSONField
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2017-06-27
      相关资源
      最近更新 更多