O Apache Superset é uma ferramenta de visualização de dados poderosa e de código aberto, amplamente utilizada para criar dashboards interativos e explorar dados. No entanto, conectar o Superset ao Oracle Database pode ser desafiador devido a problemas de compatibilidade com drivers. Este artigo detalha como resolver esses problemas usando um Dockerfile personalizado.

Estava eu trabalhando com o Apache superset, conectando em diversas origens de Bancos de Dados, até que, para tentar conectar no Oracle, o conector padrão odbc nao funcionava, jdbc nao funcionava, nada funcionava, procurei em alguns foruns e até hoje o problema está em aberto.

Discussão: can not connect oracle using oracledb package · Issue #25100 · apache/superset · GitHub

hey hi sqlalchemy supports python-oracledb which does not need oracle client oackage
https://docs.sqlalchemy.org/en/20/dialects/oracle.html#module-sqlalchemy.dialects.oracle.oracledb

https://pypi.org/project/oracledb

its connection string is like
'oracle+oracledb://user:password@host:port/pdb'

I installed it with this dockerfile


❯ cat Documents/Docker/superset/Dockerfile 
FROM apache/superset
USER root
RUN pip install -U pip
RUN pip install elasticsearch-dbapi
RUN pip install shillelagh[gsheetsapi]
RUN pip install mysqlclient
RUN pip install oracledb
RUN pip install psycopg2
RUN pip install pymssql
USER superset


but im getting ERROR: Could not load database driver: OracleEngineSpec

for now im using cx_Oracle with this docker file but I want to know how I can use python-oracledb


FROM apache/superset
USER root
RUN pip install -U pip
RUN pip install elasticsearch-dbapi
RUN pip install shillelagh[gsheetsapi]
RUN pip install mysqlclient
RUN pip install cx_Oracle
RUN pip install psycopg2
RUN pip install pymssql
RUN apt update;apt install -y curl unzip  libaio1
USER superset
RUN curl -o $HOME/instantclient-basiclite-linuxx64.zip -L https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
RUN cd $HOME;unzip instantclient-basiclite-linuxx64.zip
ENV LD_LIBRARY_PATH=/app/superset_home/instantclient_21_11

Depois de quebrar a cabeça tentando jdbc, odbc, cx_Oracle, python-oracledb, seguindo a própria documentação do Apache superset: Connecting to Databases | Superset

Só consegui conectar ao instalar o instantclient, então meus queridos, segue o Dockerfile que utilizei para resolver esse problema 😉

FROM apache/superset
# Switching to root to install the required packages
USER root
# install FreeTDS and dependencies
RUN apt-get update \
 && apt-get install unixodbc -y \
 && apt-get install unixodbc-dev -y \
 && apt-get install freetds-dev -y \
 && apt-get install freetds-bin -y \
 && apt-get install tdsodbc -y \
 && apt-get install --reinstall build-essential -y \
 && apt-get install rpm2cpio -y \
 && apt-get install cpio -y
 # populate "ocbcinst.ini"
RUN echo "[FreeTDS]\n\
Description = FreeTDS unixODBC Driver\n\
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so\n\
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
USER root

# Instalar wget e outras dependências
RUN apt-get update && apt-get install -y wget unzip libaio1

# Baixar e instalar o Oracle Instant Client
RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn_software/linux/instantclient/2340000/instantclient-basic-linux.x64-23.4.0.24.05.zip \
    && unzip instantclient-basic-linux.x64-23.4.0.24.05.zip -d /opt/oracle \
    && rm -f instantclient-basic-linux.x64-23.4.0.24.05.zip \
    && echo "/opt/oracle/instantclient_23_4" > /etc/ld.so.conf.d/oracle-instantclient.conf \
    && ldconfig 
# Voltar para o usuário original
USER root
# Install Dremio ODBC driver
RUN pip install pyodbc
# Example: installing the MySQL driver to connect to the metadata database
# if you prefer Postgres, you may want to use `psycopg2-binary` instead
RUN pip install mysqlclient
# Example: installing a driver to connect to Redshift
# Find which driver you need based on the analytics database
# you want to connect to here:
# https://superset.apache.org/installation.html#database-dependencies
#RUN pip install pydobc
RUN pip install sqlalchemy-redshift
RUN pip install sqlalchemy-dremio
RUN pip install pymssql
RUN pip install oracledb
# Switching back to using the `superset` user
USER superset

Explicação do Dockerfile

Instalação de Dependências

O Dockerfile começa com a instalação de várias dependências necessárias para configurar o ambiente. Isso inclui unixodbcfreetds, e outras bibliotecas essenciais.

Configuração do Oracle Instant Client

Em seguida, o Dockerfile baixa e instala o Oracle Instant Client, que é necessário para a conexão com o Oracle Database. A configuração do LD_LIBRARY_PATH garante que o cliente Oracle seja encontrado corretamente pelo sistema.

Instalação de Drivers

O Dockerfile também instala vários drivers de banco de dados, incluindo pyodbcmysqlclientsqlalchemy-redshiftsqlalchemy-dremiopymssql, e oracledb. Esses drivers são necessários para conectar o Superset a diferentes tipos de bancos de dados.

Testando a Conexão

Após construir a imagem Docker com o Dockerfile acima, você pode testar a conexão do Superset ao Oracle Database. Certifique-se de que a string de conexão esteja no formato correto:

oracle+oracledb://user:password@host:port/service_name

Espero ter ajudado. Um grande abraço a todos!