3
respostas

Gravando dados de um arquivo .csv no Oracle

Usando o código abaixo, eu consigo ler um arquivo .csv e guardar os dados no Oracle. Mas somente se os campos não forem nulos. Se tiver um campo nulo, pelo menos, é exibida a mensagem. O que devo fazer?

import cx_Oracle

# Conexão com o banco de dados Oracle
connection = cx_Oracle.connect("SGE_CENSO/scenso203@exacc01-scan.pbh:1521/prd004.pbh") 

import pandas as pd

caminho_do_arquivo = 'D:\\Prodabel\\SMED\\2023\\Censo Final\\TS_BH\\ts_censo_basico_gestor_pequeno.dat'

dados = pd.read_csv(caminho_do_arquivo, delimiter='|',header=None)
dados.head()

cursor = connection.cursor()

insert_query = "INSERT INTO TS_CENSO_BASICO_GESTOR_TESTE_PEQUENO (NU_ANO_CENSO,CO_PROJETO,CO_EVENTO,CO_PESSOA_FISICA) VALUES (:1, :2, nvl(:3,99), :4)"

for index, row in dados.iterrows():
    # Execute o comando SQL com os valores da linha atual
  

    print("Query:", insert_query)
    print("Values:", tuple(row))
    
    cursor.execute(insert_query, tuple(row))

# Faça commit e feche a conexão
connection.commit()
cursor.close()
connection.close()
3 respostas

Olá Mariana, tudo bem?

Se os valores nulos podem aparecer em qualquer um dos campos, você precisa tratar isso para todos os campos. Uma forma de fazer isso é usando o método fillna() do pandas para preencher os valores nulos antes de inseri-los no banco de dados.

Você pode utilizar o seguinte código, após a leitura do arquivo csv:


dados = dados.fillna(0)

No exemplo, o argumento 0 especifica que os valores nulos devem ser preenchidos com zero, mas você pode substituir isso pelo valor que fizer mais sentido no seu caso.

Espero ter ajudado.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado Monalisa.

Mas eu preciso gravar os campos nulos e não consegui ainda.

Olá, Mariana, tudo bem?

Desde já peço desculpas pela demora em obter um retorno.

Neste caso, você pode modificar a maneira como está tratando os valores nulos durante a inserção dos dados. Notei que você está usando a função nvl apenas para o campo CO_EVENTO, mas não está tratando os outros campos nulos.

Para tratar os campos nulos de forma mais genérica, você pode usar o valor None em Python para representar campos nulos e modificar a sua consulta SQL para lidar com isso.

Tente fazer o teste com o seguinte código:

import cx_Oracle
import pandas as pd

# Conexão com o banco de dados Oracle
connection = cx_Oracle.connect("SGE_CENSO/scenso203@exacc01-scan.pbh:1521/prd004.pbh")

caminho_do_arquivo = 'D:\\Prodabel\\SMED\\2023\\Censo Final\\TS_BH\\ts_censo_basico_gestor_pequeno.dat'

dados = pd.read_csv(caminho_do_arquivo, delimiter='|', header=None)

cursor = connection.cursor()

insert_query = "INSERT INTO TS_CENSO_BASICO_GESTOR_TESTE_PEQUENO (NU_ANO_CENSO, CO_PROJETO, CO_EVENTO, CO_PESSOA_FISICA) VALUES (:1, :2, :3, :4)"

for index, row in dados.iterrows():
    # Substituir campos nulos por None
    row = [None if pd.isnull(value) else value for value in row]

    # Execute o comando SQL com os valores da linha atual
    print("Query:", insert_query)
    print("Values:", tuple(row))
    cursor.execute(insert_query, tuple(row))

# Faça commit e feche a conexão
connection.commit()
cursor.close()
connection.close()

Com essas alterações, qualquer campo nulo presente nos dados será tratado como None em Python e inserido como NULL no banco de dados Oracle.

Lembre-se que os tipos de dados dos campos no banco de dados aceitam valores nulos, caso contrário, você pode enfrentar erros durante a inserção.

Espero ter ajudado.

Caso surja alguma dúvida , fico à disposição.

Abraços e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!