Eu sei que o SQLite não tem um tipo de dados booleano, mas para uma coluna JSON eu gostaria de definir o valor como um booleano real em vez de um booleano 0/1, mas o SQLite sempre parece defini-lo como um int .
Exemplo:
sqlite> create table test (j text);
sqlite> insert into test values ('{"b":true}');
Verifique se temos um JSON válido e extraia o valor:
sqlite> select json_valid(j) from test;
1
sqlite> select json_extract(j, '$.b') from tests;
1
Ok, então extrair um valor o converte em um tipo de dados SQLite "nativo", o que faz sentido e está documentado nos json_extract()
documentos, mas defini-lo também, o que é um pouco chato:
sqlite> select json_set(j, '$.b', true) from test;
{"b":1}
sqlite> select json_set(j, '$.b', 'true') from test;
{"b":"true"}
Posso escrever algum código em meu aplicativo para reconhecer 0/1 como booleano e convertê-lo, mas prefiro não apenas porque uma migração de banco de dados precisa mover alguns campos JSON de uma coluna para outra, pois introduz algumas complexidades no line (preciso alterar alguns tipos e depois também modificar algumas funções genéricas que atualmente aceitam apenas um bool
tipo para ser polimórfico).
Existe alguma maneira de definir isso como um booleano JSON real como {"b": true}
?
Estou usando o SQLite 3.34.1 (o changelog 3.35 não menciona nada sobre JSON, então presumo que não seja alterado na versão mais recente).
Minha solução atual é usar uma substituição de string após definir os valores:
update test set j = replace(replace(j,
'"b":0', '"b":false'),
'"b":1', '"b":true');
Mas meh.
Para que 'true' seja reconhecido como o objeto JSON real
true
, você pode usar ajson()
função, por exemploref: