Olá @Alexandre
Fiz um exemplo me baseando nos dados que você forneceu.
Bom no Python um arquivo Json é convertido para o tipo dicionário e o acesso aos dados é feito acessando as chaves do arquivo ({chave: valor}
, {chave: {chave: valor}}
, {chave: [lista de valores]}
).
Criei um arquivo chamado arquivo_json.json com os dados que você forneceu:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"Id": "02900c40-0e95-4369-b9c4-22b2233a3440",
"geometry": {
"type": "Point",
"coordinates": [
4.915205,
52.377864
]
},
"properties": {
"Name": "CE-P28 PTA Touringcars",
"PubDate": "2019-10-21T01:14:41.972Z",
"Type": "parkinglocation",
"State": "ok",
"FreeSpaceShort": "0",
"FreeSpaceLong": "",
"ShortCapacity": "42",
"LongCapacity": ""
}
},
{
"type": "Feature",
"Id": "900000118_parkinglocation",
"geometry": {
"type": "Point",
"coordinates": [
4.92911,
52.35694
]
},
"properties": {
"Name": "CE-P20 Oostpoort",
"PubDate": "2019-10-21T01:14:41.972Z",
"Type": "parkinglocation",
"State": "ok",
"FreeSpaceShort": "319",
"FreeSpaceLong": "0",
"ShortCapacity": "373",
"LongCapacity": "0"
}
}
]
}
O fato do aquivo estar formatado (com espaços) como você descreveu não é um problema é apenas uma forma de ficar legível para ‘humanos’, contudo durante a execução do código fiz um print()
onde os dados são exibidos sem formatação.
Como não faço ideia da sua estrutura de tabela(s) eu fiz uma simulação utilizando uma tabela que possui uma coluna id (chave primaria) e uma coluna dict do tipo JSONB.
Você disse em seu texto que você não é programador, então fiz um código bem linear, sem criar classes, métodos, funções, etc.
# -*- coding: utf-8 -*-
"""Exemplo, adeque conforme as suas necessidades.
Para instalar o psycopg2_ pode-se utilizar:
.. _psycopg2: http://initd.org/psycopg/
.. code-block:: bash
pip install psycopg2-binary
"""
import json
from psycopg2 import connect
from psycopg2.extras import Json
# Abrindo o arquivo (pode-se utilizar o ``with open()``).
json_file = open(file='arquivo_json.json')
# Lendo o arquivo como Json.
data = json.load(json_file)
# Fechando o arquivo, visto que ele não é mais necessário.
json_file.close()
# Exibindo os dados que estão na chave `features`.
# Utilizando o Loop ``for``` porque os dados
# estão contido em uma lista.
for values in data['features']:
print(f'\n{values}\n----')
# Criando a conexão com o banco.
# Para teste utilizei o https://www.elephantsql.com/.
con = connect(
user='gsrndmds',
password='kXOmIUIfsfUmcjCNIzAB22vZQ8C6U7vA',
host='salt.db.elephantsql.com',
port='5432',
dbname='gsrndmds',
)
# Criando o cursor que irá executar os
# comandos SQL (instruções DML, DDL, etc).
cur = con.cursor()
# Removendo a tabela.
# Estou removendo a tabela para não
# ficar repetido os dados toda hora.
query = f'DROP TABLE IF EXISTS nome_da_tabela'
try:
cur.execute(query)
except Exception as e:
print(f'\n[x] Falha ao remover a tabela [x]: {e}')
else:
con.commit()
print('\n[!] Tabela removida com sucesso [!]')
# Criando a tabela caso ela não exista.
# Caso você já tenha a tabela é só ignorar essa parte.
create_table = '''CREATE TABLE IF NOT EXISTS nome_da_tabela (
_id SERIAL NOT NULL,
dict JSONB,
PRIMARY KEY(_id)
);'''
try:
cur.execute(create_table)
except Exception as e:
print(f'\n[x] Falha ao criar a tabela [x]: {e}')
else:
print('\n[!] Tabela criada com sucesso [!]')
# Exibindo os dados da tabela ANTES da inserção.
query = 'SELECT * FROM nome_da_tabela LIMIT 100'
cur.execute(query)
print(f'Dados da tabela antes: {cur.fetchall()}\n----')
# Query que irá inserir os dados.
query = 'INSERT into nome_da_tabela (dict) values (%s)'
# Loop para percorrer todos os dados que estão na lista.
for values in data['features']:
# Salvando os dados no banco.
cur.execute(query, [Json(values)])
# Exibindo os dados da tabela DEPOIS da inserção.
query = 'SELECT * FROM nome_da_tabela LIMIT 100'
cur.execute(query)
print(f'Dados da tabela após: {cur.fetchall()}\n---')
# Fechando a conexão com o banco.
con.close()
Eu utilizei try e except para controlar os erros, contudo isso não é necessário dependendo do seu cenário.
Os dados de conexão do PostgreSQL que estão no código são válidos, vou deixá-los ativos por alguns dias assim você pode testar.
Caso queira ver alguns exemplos de conexão com banco de dados basta acessar o meu Github.