Eu tenho um json que recebo como um arquivo, carreguei isso no banco de dados Postgres. Aqui estão os dados json:
{
"tablename": "test",
"columns": [
{
"name": "field1",
"datatype": "BigInt"
},
{
"name": "field2",
"datatype": "String"
}
]
}
Agora tenho que criar uma tabela dinamicamente, estou pensando em escrever uma função no Postgres para fazer isso. Então a tabela seria nomeada teste com 2 campos um como string e outro como bigint.
Eu sou capaz de obter o nome da tabela fazendo um select como abaixo:
select (metadata->'tablename') from public.json_metadata;
No entanto, estou tendo dificuldade em obter todos os nomes de colunas aninhadas para formar uma instrução de criação de tabela.
1- Como você faria isso, qualquer função do Postgres embutida para extrair isso.
2- Uma função Postgres é a melhor maneira de abordar este problema, ou devo escrever isso em python (terei que aprender Python) ou script de shell.
O número de colunas não seria fixo, diferentes arquivos json terão um número diferente de colunas.
Você precisa de SQL dinâmico para isso, o que traz o risco de injeção de SQL.
No entanto, feito corretamente, isso é seguro contra SQLi:
Os nomes de tabela e coluna são tratados com distinção entre maiúsculas e minúsculas. (Você pode preferir letras minúsculas.) O nome do tipo é tratado como não diferenciando maiúsculas de minúsculas e qualquer nome de tipo válido funciona.
Obviamente, isso geraria uma exceção para o tipo de dados inexistente
String
exibido. Tente comtext
em vez disso.Observe o uso de
format()
, o tipo de identificador de objetoregclass
,quote_ident()
, a agregação de colunas naLATERAL
subconsulta e oDO
comando para executar SQL dinâmico.Relacionado: