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.