Guia de Conexão e Inserção de Dados no Oracle Database com Python 3

Preparação do Oracle Instant Client

Para estabelecer a comunicação entre o Python e o banco de dados Oracle, é fundamental configurar o ambiente cliente. Neste guia, utilziamos a versão 11.2.0.4.0 como referência.

1. Requisitos de Compatibilidade

  • Certifique-se de que a versão do Instant Client seja compatível com a versão do servidor Oracle.
  • A arquitetura (32-bit ou 64-bit) deve ser consistente entre o Python, o Oracle Client e o sistema operacional.

2. Instalação e Links Simbólicos

Após baixar os pacotes basic e sdk do Oracle Instant Client para Linux, descompacte-os no mesmo diretório. Navegue até a pasta extraída e crie o link simbólico necessário para a biblioteca compartilhada:

cd instantclient_11_2
ln -s libclntsh.so.11.1 libclntsh.so

3. Configuração de Rede (TNS)

Crie a estrutura de diretórios para as configurações de rede e defina o descritor de conexão no arquivo tnsnames.ora:

mkdir -p network/admin
touch network/admin/tnsnames.ora

Adicione a seguinte configuração ao arquivo, ajustando o HOST e o SERVICE_NAME conforme sua infraestrutura:

DB_REMOTO =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = xe)
   )
 )

4. Definição de Variáveis de Ambiente

Edite o arquivo /etc/profile ou o arquivo de configuração do seu shell para incluir os caminhos do Oracle Client:

export ORACLE_HOME=/opt/oracle/instantclient_11_2
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG='BRAZILIAN PORTUGUESE_BRAZIL.AL32UTF8'
export PATH=$ORACLE_HOME:$PATH

Aplique as alterações com o comando source /etc/profile.

Implementação em Python

Instale o driver necessário via pip:

pip install cx-Oracle

Script de Inserção Concorrente

O exemplo abaixo demonstra como realizar inserções em massa utilizando múltiplas threads para otimizar o processo.

import cx_Oracle
import threading
import time

def persistir_dados(id_thread):
    db_user = "usuario_app"
    db_pass = "senha_segura"
    db_host = "192.168.1.100"
    db_port = 1521
    db_service = "xe"
    
    # Gerar a string DSN
    dsn = cx_Oracle.makedsn(db_host, db_port, service_name=db_service)
    
    try:
        conn = cx_Oracle.connect(user=db_user, password=db_pass, dsn=dsn)
        conn.autocommit = True
        cur = conn.cursor()
        
        instrucao_sql = "INSERT INTO LOG_PROCESSAMENTO (DESCRICAO, VALOR, DATA_REGISTRO) VALUES (:1, :2, TO_DATE(:3, 'YYYYMMDD'))"
        
        registros_inseridos = 0
        meta_insercao = 50000
        
        for i in range(meta_insercao):
            cur.execute(instrucao_sql, ('LOG_TH_' + str(id_thread), 10.5, '20231027'))
            registros_inseridos += 1
            
        print(f"Thread {id_thread} finalizada. Total: {registros_inseridos}")
        
        cur.close()
        conn.close()
    except cx_Oracle.Error as erro:
        print(f"Erro na Thread {id_thread}: {erro}")

if __name__ == '__main__':
    pool_threads = []
    for indice in range(5):
        thread = threading.Thread(target=persistir_dados, args=(indice,))
        pool_threads.append(thread)
        thread.start()
        time.sleep(0.5)

    for thread in pool_threads:
        thread.join()

Resolução de Erros Comuns

Caso encontre o erro DPI-1047: 64-bit Oracle Client library cannot be loaded, mesmo após configurar as variáveis de ambiente, é necessário registrar o caminho das bibliotecas no cache do sistema:

echo "/opt/oracle/instantclient_11_2" > /etc/ld.so.conf.d/oracle-client.conf
ldconfig

Este procedimento garante que o carregador de bibliotecas dinâmicas do Linux localize corretamente os arquivos .so do Oracle.

Tags: oracle-database cx-oracle Python instant-client Linux

Publicado em 8-5 13:35