Извлечение содержимого JSON в SQL-запрос Metabase

Использует: Django==2.2.24, Python=3.6, PostgreSQL - базовая БД
. Работая с 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_OBJECT_KEYS() без добавления каста ::json, я получал эту ошибку:

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 cast я получаю все ключи, как и предполагалось.


Спасибо, что посмотрели!

Ок, покопавшись еще немного, я нашел эту статью, в которой был правильный формат/синтаксис.

Этот код я использовал для успешного получения списка из объекта 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 

Все готово! :)

Вернуться на верх