Создайте соединение с автономной базой данных Oracle из док-контейнера через SqlAlchemy - PullRequest
0 голосов
/ 10 ноября 2019

Я работаю на облачной машине Oracle, на которой приложение python-flask развернуто в докер-контейнере.
Я пытаюсь установить соединение приложения с Oracle Автономной базой данных.
Это соединение установлено Python ORM SQLAlchemy

Соединение с mysql было установлено без каких-либо проблем с деталями, приведенными ниже.

engine = create_engine(
                'mysql+mysqlconnector://username:password@host:3306/databasename')
            cls.session_factory = sessionmaker(bind=engine)
            cls.base = declarative_base(bind=engine)

Но когда я пытаюсь подключиться к базе данных oracle с помощью драйвера cx_oracle, выдается ошибка.

engine = create_engine(
                'oracle+cx_oracle://username:password@host:1522/databasename')
            cls.session_factory = sessionmaker(bind=engine)
            cls.base = declarative_base(bind=engine)

Выдана ошибка:

sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help

Из вышеприведенной ошибки я понял, что мне нужно предоставить клиентскую библиотеку oracle, которую я затем скачал и установил.

RUN apt-get update && apt-get install unzip
RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip
RUN unzip instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip
RUN apt-get update && apt-get install libaio1
RUN ldconfig

Но проблема по-прежнему существует.

Кто-нибудь пытался создать соединение с Oracle Автономной базой данных из приложения Python, даже если оно не из док-контейнера или даже без sql-alchemy

ОБНОВЛЕНИЕ

Проблема еще не решена. Я вставляю точный докер-файл ниже для справки.


FROM python:3.6-buster
RUN echo 'setting workdir'
WORKDIR /app

RUN echo 'running docker, install dependencies of docker file '
ADD requirements.txt /app/requirements.txt
RUN echo 'now installing from req.txt if any left'
RUN pip install -r /app/requirements.txt
RUN echo 'copying everything to app'
COPY . /app

RUN mkdir opt && cd opt && \
    wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip && \
    unzip instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip && \
    echo /instantclient_19_3 > /etc/ld.so.conf.d/oracle-instantclient.conf && \
    cd instantclient_19_3 && ls -lrt && ldconfig

ENV TNS_ADMIN=/app/keys
RUN ls -lrt
RUN echo 'port exposed'
EXPOSE 5060
CMD ["gunicorn", "-b", "0.0.0.0:5060", "-t","120", "wsgi"]

СООБЩЕНИЕ ОБ ОШИБКЕ:

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help


1 Ответ

1 голос
/ 11 ноября 2019

Вы пропустили один шаг мгновенного клиента инструкция по установке . Перед запуском ldconfig необходимо обновить конфигурацию пути поиска библиотек, чтобы были найдены библиотеки Instant Client.

Измените первый путь к каталогу, в который вы распаковываете файлы:

echo /opt/oracle/instantclient_19_3 > /etc/ld.so.conf.d/oracle-instantclient.conf
...