Eu li sobre objetos JSON e o tipo de objeto JSON. Eu só quero fazer um select e ele retornar JSON. Não quero necessariamente armazenar um objeto JSON. Serialização em si, não é minha pergunta. As colunas são colunas regulares Varchar, Int, etc., sem objetos JSON, linhas de banco de dados "normais".
Posso fazer um SELECT antigo regular e retornar JSON para MySQL?
Não é isso que FOR JSON no SQL SERVER e rows_for_json fazem no PostgreSQL?
Eles pareciam à frente neste são, mas eu não queria me enganar.
Encontrei esta pergunta de 2016: https://stackoverflow.com/questions/35324795/mysql-5-7-return-row-as-json-using-new-json-features
Convertendo uma linha para json
Não me parece que você queira agregar JSON. Você afirma que deseja o equivalente a
row_to_json
, se sim, sugiro verificar o muito mais simplesJSON_OBJECT
Agregando JSON
Como observação lateral, se você precisar agregar um conjunto de resultados ao json. então o próximo MySQL 8 fará isso por você.
JSON_ARRAYAGG()
Retorne o conjunto de resultados como uma única matriz JSONJSON_OBJECTAGG()
` Retorna o conjunto de resultados como um único objeto JSONDemorei um pouco para entender (mais acostumado com PostgreSQL onde as coisas são muito mais fáceis !), mas se você consultar o bom manual aqui , em
12.16.2 Functions That Create JSON Values
, tem aJSON_ARRAY
função, mas não é muito útil realmente - pelo menos neste caso!Para responder à pergunta
"select and it return JSON"
, existem duas maneiras de fazer isso, ambas bastante dolorosas!Você também pode
use um "hack" - veja o db-fiddle aqui ,
ou use uma das novas funções JSON fornecidas pelo MySQL aqui - que, ironicamente, parece ser ainda mais um hack do que o próprio hack! Só com MySQL! :-) (violino aqui ).
Ambas as respostas usam a
GROUP_CONCAT
função MySQL - este post ajudou. Você pode querer definir a variável de sistema group_concat_max_len para um pouco mais do que seu padrão (um insignificante 1024)!A primeira consulta é, como você pode imaginar, confusa (
DDL
eDML
na parte inferior desta resposta):Resultado:
o que está correto, mas, convenhamos, um pesadelo!
Depois, há a
JSON_ARRAY()
abordagem MySQL (que é ainda mais confusa - obrigado MySQL por sua implementação (inexistente) daTRANSLATE()
função!).Mesmo resultado!
Para uma matriz de objetos JSON (um objeto por linha na consulta), você pode fazer isso:
Isso resultaria em uma única matriz JSON contendo todas as entradas:
Infelizmente, o MySQL não permite selecionar todos os campos com
*
. Isso seria incrível, mas não funciona:Isso lhe dará a mesma resposta, mas um código muito mais fácil. Eu apenas usei
json_object
comgroup_concat
para simplificar a outra resposta .Se você não deseja fazer isso no contexto de nenhum ambiente de host específico (por exemplo, node.js, Python, MySQL Workbench), o MySQL Shell oferece suporte à saída JSON . Cada linha em um resultado é gerada como um objeto separado. Ele pode imprimir uma saída bonita e pode gerar uma matriz de objetos ou separar cada linha com novas linhas. Por exemplo, no prompt do shell, digite:
Em seguida, execute uma consulta normalmente.
Como bônus, o MySQL Shell também suporta JavaScript e Python, embora você só possa se livrar de instruções SQL se o servidor estiver configurado como um armazenamento de documentos . Então, depois de definir o esquema ativo, você pode acessar as tabelas relacionais por meio do
db
objeto. Seja usando JS ou Python, a instrução correspondente à consulta SQL acima é a mesma: