Из документа sqlite3
select json_insert('{"a":2,"c":4}', '$.e', 99) -- → '{"a":2,"c":4,"e":99}'
Но как добавить новый элемент в массив?
select json_insert('[1,2,3]', ??, 4) -- → '[1, 2, 3, 4]'
update someTable set someArray = json_insert(someArray, ??, 'some new value')

По-видимому, нет функции или простого способа сделать это, но мы можем добиться этого:
json_eachUNION ALLGROUP BYjson_group_arrayНапример, если у вас есть таблица Messages с PRIMARY KEY id и массив JSON в account, вы можете добавить элемент в массив учетных записей во всех строках с помощью:
SELECT id, json_group_array(value) FROM (
SELECT Messages.id, json_each.value
FROM Messages, json_each(Messages.account)
UNION ALL SELECT Messages.id, 'new_account' FROM Messages
) GROUP BY id;
Что нам нужно еще раз обернуть, чтобы вставить UPDATE, поскольку SQLite не поддерживает UPDATE + JOIN. Это добавит новую учетную запись во все строки:
UPDATE Messages SET account = (SELECT account FROM (
SELECT id, json_group_array(value) as account FROM (
SELECT Messages.id, json_each.value
FROM Messages, json_each(Messages.account)
UNION ALL SELECT Messages.id, 'new_account' FROM Messages
) GROUP BY id
) WHERE id = Messages.id);
Мы можем упростить это, если вы хотите обновить только одну строку следующим образом:
UPDATE Messages SET account = (
SELECT json_group_array(value) FROM (
SELECT json_each.value
FROM Messages, json_each(Messages.account)
WHERE Messages.id = 123456789
UNION ALL SELECT 'new_account'
) GROUP BY ''
) WHERE id = 123456789;
После нескольких попыток я наконец понял
update some_table
set some_array = json_insert(
some_array,
'$[' || json_array_length(some_array) || ']',
'new item'
)
where id = some_id;
В версии 3.31.0 была введена новая нотация для прямой поддержки этой функции:
select json_insert('[1,2,3]', '$[#]', 4) -- → '[1, 2, 3, 4]'