Настройка Oracle
- Поддерживается: Oracle
- Авторы: Oracle
- Репозиторий на GitHub: oracle/dbt-oracle
- Пакет на PyPI:
dbt-oracle
- Канал в Slack: #db-oracle
- Поддерживаемая версия dbt Core: v1.2.1 и новее
- Поддержка dbt Cloud: Not Supported
- Минимальная версия платформы данных: Oracle 12c and higher
Установка dbt-oracle
Используйте pip
для установки адаптера. До версии 1.8 установка адаптера автоматически устанавливала dbt-core
и любые дополнительные зависимости. Начиная с версии 1.8, установка адаптера не устанавливает автоматически dbt-core
. Это связано с тем, что адаптеры и версии dbt Core были разделены, и мы больше не хотим перезаписывать существующие установки dbt-core.
Используйте следующую команду для установки:
Конфигурация dbt-oracle
Для конфигурации, специфичной для Oracle, пожалуйста, обратитесь к конфигурациям Oracle.
Настройка режима драйвера Python
python-oracledb делает установку библиотек Oracle Client необязательной. Этот драйвер поддерживает 2 режима:
- Тонкий режим (предпочтительный): Процесс Python напрямую подключается к базе данных Oracle. В этом режиме не требуются библиотеки Oracle Client.
- Толстый режим: Процесс Python связывается с библиотеками Oracle Client. Некоторые расширенные функции базы данных Oracle (например, Advanced Queuing, LDAP-соединения, прокручиваемые курсоры) в настоящее время доступны через библиотеки Oracle Client.
Вы можете настроить режим драйвера, используя переменную окружения ORA_PYTHON_DRIVER_TYPE
. Используйте тонкий режим, так как он значительно упрощает установку.
Режим драйвера | Требуются ли библиотеки Oracle Client? | Конфигурация |
---|---|---|
Тонкий | Нет | ORA_PYTHON_DRIVER_TYPE=thin |
Толстый | Да | ORA_PYTHON_DRIVER_TYPE=thick |
Значение по умолчанию для ORA_PYTHON_DRIVER_TYPE
— thin
.
- Тонкий
- Толстый
export ORA_PYTHON_DRIVER_TYPE=thin # по умолчанию
export ORA_PYTHON_DRIVER_TYPE=thick
Установка библиотек Oracle Instant Client
В толстом режиме вам понадобятся установленные библиотеки Oracle Instant Client. Они обеспечивают необходимую сетевую связь, позволяя dbt-oracle получить доступ к экземпляру базы данных Oracle.
Поддерживаются версии Oracle Client 23, 21, 19, 18, 12 и 11.2. Рекомендуется использовать последнюю доступную версию клиента: стандартная совместимость версий клиент-сервер Oracle позволяет подключаться как к более старым, так и к более новым базам данных.
- Linux
- Windows
- MacOS
-
Скачайте zip-файл Oracle 23, 21, 19, 18, 12 или 11.2 "Basic" или "Basic Light", соответствующий вашей архитектуре Python 64-бит или 32-бит:
-
Распакуйте пакет в одну директорию, доступную вашему приложению. Например:
mkdir -p /opt/oracle
cd /opt/oracle
unzip instantclient-basic-linux.x64-21.6.0.0.0.zip
- Установите пакет libaio с помощью sudo или от имени пользователя root. Например:
sudo yum install libaio
В некоторых дистрибутивах Linux этот пакет называется libaio1
.
- Если на машине нет другого программного обеспечения Oracle, которое будет затронуто, добавьте Instant Client в путь к библиотекам времени выполнения. Например, с помощью sudo или от имени пользователя root:
sudo sh -c "echo /opt/oracle/instantclient_21_6 > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig
В качестве альтернативы установите переменную окружения LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_6:$LD_LIBRARY_PATH
- Если вы используете дополнительные файлы конфигурации Oracle, такие как tnsnames.ora, sqlnet.ora или oraaccess.xml с Instant Client, поместите файлы в доступную директорию и установите переменную окружения TNS_ADMIN на имя этой директории.
export TNS_ADMIN=/opt/oracle/your_config_dir
- Скачайте zip-файл Oracle 21, 19, 18, 12 или 11.2 "Basic" или "Basic Light": 64-бит или 32-бит, соответствующий вашей архитектуре Python.
Обратите внимание, что версии Oracle Client 21c и 19c не поддерживаются на Windows 7.
-
Распакуйте пакет в директорию, доступную вашему приложению. Например, распакуйте
instantclient-basic-windows.x64-19.11.0.0.0dbru.zip
вC:\oracle\instantclient_19_11
. -
Библиотеки Oracle Instant Client требуют Visual Studio redistributable с 64-битной или 32-битной архитектурой, соответствующей архитектуре Instant Client.
- Для Instant Client 21 установите VS 2019 или более позднюю версию
- Для Instant Client 19 установите VS 2017
- Для Instant Client 18 или 12.2 установите VS 2013
- Для Instant Client 12.1 установите VS 2010
- Для Instant Client 11.2 установите VS 2005 64-bit
-
Добавьте директорию Oracle Instant Client в переменную окружения
PATH
. Директория должна находиться вPATH
перед любыми другими директориями Oracle. Перезапустите все открытые окна командной строки.SET PATH=C:\oracle\instantclient_19_9;%PATH%
Проверьте документацию python-oracledb для инструкций по установке на MacOS ARM64 или MacOS Intel x84-64
Настройка кошелька для Oracle Autonomous Database (ADB-S) в облаке
dbt может подключаться к Oracle Autonomous Database (ADB-S) в Oracle Cloud, используя либо TLS (Transport Layer Security), либо взаимный TLS (mTLS). TLS и mTLS обеспечивают повышенную безопасность для аутентификации и шифрования. Имя пользователя и пароль базы данных по-прежнему требуются для подключений dbt, которые можно настроить, как объясняется в следующем разделе Подключение к базе данных Oracle.
- TLS
- Взаимный TLS
С TLS dbt может подключаться к Oracle ADB без использования кошелька. Оба режима драйвера python-oracledb поддерживают TLS.
В толстом режиме dbt может подключаться через TLS только при использовании версий библиотеки Oracle Client 19.14 (или более поздних) или 21.5 (или более поздних).
Обратитесь к документации Oracle, чтобы подключиться к экземпляру ADB с использованием аутентификации TLS и к блогу Легкие подключения без кошелька к Oracle Autonomous Databases в Python, чтобы включить TLS для вашего э кземпляра Oracle ADB.
Для взаимных TLS-соединений необходимо скачать кошелек из консоли OCI и настроить драйвер Python для его использования.
Установка кошелька и файлов конфигурации сети
Из консоли Oracle Cloud для базы данных скачайте zip-файл кошелька, используя кнопку DB Connection
. Zip-файл содержит кошелек и файлы конфигурации сети.
Храните файлы кошелька в безопасном месте и делитесь ими только с авторизованными пользователями.
Распакуйте zip-файл кошелька.
- Тонкий
- Толстый
В тонком режиме нужны только два файла из zip-архива:
-
tnsnames.ora
- Сопоставляет сетевые имена служб, используемые для строк подключения приложений, с вашими службами базы данных -
ewallet.pem
- Обеспечивает SSL/TLS-соединения в тонком режиме. Храните этот файл в безопасности
После распаковки файлов в безопасную директорию установите переменные окружения TNS_ADMIN и WALLET_LOCATION на имя директории.
export WALLET_LOCATION=/path/to/directory_containing_ewallet.pem
export WALLET_PASSWORD=***
export TNS_ADMIN=/path/to/directory_containing_tnsnames.ora
При необходимости, если файл ewallet.pem
зашифрован с использованием пароля кошелька, укажите пароль, используя переменную окружения WALLET_PASSWORD
В толстом режиме из zip-архива нужны следующие файлы:
tnsnames.ora
- Сопоставляет сетевые имена служб, используемые для строк подключения приложений, с вашими службами базы данныхsqlnet.ora
- Настраивает параметры сети Oraclecwallet.sso
- Обеспечивает SSL/TLS-соединения
После распаковки файлов в безопасную директорию установите переменную окружения TNS_ADMIN на имя этой директории.
export TNS_ADMIN=/path/to/directory_containing_tnsnames.ora
Затем отредактируйте файл sqlnet.ora
, чтобы указать на директорию кошелька.
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/path/to/wallet/directory")))
SSL_SERVER_DN_MATCH=yes
Подключение к базе данных Oracle
Определите следующие обязательные параметры в качестве переменных окружения и используйте их в профиле подключения с помощью функции jinja env_var. При желании вы также можете определить их напрямую в файле profiles.yml
, но это не рекомендуется.
export DBT_ORACLE_USER=<username>
export DBT_ORACLE_PASSWORD=***
export DBT_ORACLE_SCHEMA=<username>
export DBT_ORACLE_DATABASE=example_db2022adb
Используйте следующий запрос, чтобы получить имя базы данных:
SELECT SYS_CONTEXT('userenv', 'DB_NAME') FROM DUAL
Профиль подключения Oracle для dbt можно настроить, используя любой из следующих методов:
- Использование TNS alias
- Использование строки подключения
- Использование имени хоста базы данных
Файл tnsnames.ora
— это файл конфигурации, содержащий сетевые имена служб, сопоставленные с дескрипторами подключения.
Местоположение директории файла tnsnames.ora
можно указать с помощью переменной окружения TNS_ADMIN
.
db2022adb_high = (description =
(retry_count=20)(retry_delay=3)
(address=(protocol=tcps)
(port=1522)
(host=adb.example.oraclecloud.com))
(connect_data=(service_name=example_high.adb.oraclecloud.com))
(security=(ssl_server_cert_dn="CN=adb.example.oraclecloud.com,
OU=Oracle BMCS US,O=Oracle Corporation,L=Redwood City,ST=California,C=US")))
TNS alias db2022adb_high
можно определить как переменную окружения и использовать в profiles.yml
.
export DBT_ORACLE_TNS_NAME=db2022adb_high
dbt_test:
target: dev
outputs:
dev:
type: oracle
user: "{{ env_var('DBT_ORACLE_USER') }}"
pass: "{{ env_var('DBT_ORACLE_PASSWORD') }}"
database: "{{ env_var('DBT_ORACLE_DATABASE') }}"
tns_name: "{{ env_var('DBT_ORACLE_TNS_NAME') }}"
schema: "{{ env_var('DBT_ORACLE_SCHEMA') }}"
threads: 4
Строка подключения определяет, к какой службе базы данных подключаться. Это может быть:
- Строка легкого подключения Oracle
- Строка дескриптора подключения Oracle Net
- Сетевое имя службы, сопоставленное с дескриптором подключения
export DBT_ORACLE_CONNECT_STRING="(description=(retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)
(host=adb.example.oraclecloud.com))(connect_data=(service_name=example_high.adb.oraclecloud.com))
(security=(ssl_server_cert_dn=\"CN=adb.example.oraclecloud.com,
OU=Oracle BMCS US,O=Oracle Corporation,L=Redwood City,ST=California,C=US\")))"
dbt_test:
target: "{{ env_var('DBT_TARGET', 'dev') }}"
outputs:
dev:
type: oracle
user: "{{ env_var('DBT_ORACLE_USER') }}"
pass: "{{ env_var('DBT_ORACLE_PASSWORD') }}"
database: "{{ env_var('DBT_ORACLE_DATABASE') }}"
schema: "{{ env_var('DBT_ORACLE_SCHEMA') }}"
connection_string: "{{ env_var('DBT_ORACLE_CONNECT_STRING') }}"
Чтобы подключиться, используя имя хоста базы данных или IP-адрес, необходимо указать следующее:
- host
- port (1521 или 1522)
- protocol (tcp или tcps)
- service
export DBT_ORACLE_HOST=adb.example.oraclecloud.com
export DBT_ORACLE_SERVICE=example_high.adb.oraclecloud.com
dbt_test:
target: "{{ env_var('DBT_TARGET', 'dev') }}"
outputs:
dev:
type: oracle
user: "{{ env_var('DBT_ORACLE_USER') }}"
pass: "{{ env_var('DBT_ORACLE_PASSWORD') }}"
protocol: "tcps"
host: "{{ env_var('DBT_ORACLE_HOST') }}"
port: 1522
service: "{{ env_var('DBT_ORACLE_SERVICE') }}"
database: "{{ env_var('DBT_ORACLE_DATABASE') }}"
schema: "{{ env_var('DBT_ORACLE_SCHEMA') }}"
retry_count: 1
retry_delay: 3
threads: 4
Начиная с dbt-oracle==1.0.2
, установка имени database
в profile.yml
является необязательной.
Начиная с dbt-oracle==1.8.0
, ключ database в profile.yml
все еще необязателен для всех, кроме одного из рабочих процессов dbt-oracle.
Если database
отсутствует в profile.yml
, сгенерированный каталог, используемый для документации проекта, будет пустым.
С версии dbt-oracle==1.8
мы обнаруживаем, что ключ database
отсутствует в profile.yml
, и выдаем предупреждение о необходимости его добавления для генерации каталога. Сообщение предупреждения также показывает имя базы данных, которое ожидает dbt-oracle. Таким образом, пользователям не нужно беспокоиться о том, "какое" имя базы данных и "как" его получить.
Конфигурация кавычек
Конфигурация кавычек по умолчанию, используемая dbt-oracle, показана ниже:
quoting:
database: false
identifier: false
schema: false
Это рекомендуется и работает в большинстве случаев.
Ошибка приблизительного совпадения отношения
Часто пользователи жалуются на ошибку приблизительного совпадения отношения, как показано ниже:
Ошибка компиляции в модели <model>
19:09:40 При поиске отношения dbt нашел приблизительное совпадение. Вместо того чтобы угадывать,
19:09:40 какое отношение использовать, dbt продолжит. Пожалуйста, удалите <model> или переименуйте его, чтобы он был менее двусмысленным.
Искали: <model>
Это сообщается в нескольких каналах:
Во всех случаях решением было включение кавычек только для базы данных.
Чтобы решить эту проблему приблизительного совпадения
, используйте следующую конфигурацию кавычек:
quoting:
database: true
Модели Python, использующие Oracle Autonomous Database (ADB-S)
Пользователи Oracle's Autonomous Database Serverless (ADB-S) могут запускать модели dbt-py, используя Oracle Machine Learning (OML4PY), который доступен без дополнительной настройки.
Возможности
- Пользовательская функция Python выполняется в среде выполнения Python 3.12.1, созданной ADB-S
- Доступ к внешним пакетам Python, доступным в среде выполнения Python. Например,
numpy
,pandas
,scikit_learn
и т.д. - Интеграция с Conda 24.x для создания сред с пользовательскими пакетами Python
- Доступ к сеансу базы данных в функции Python
- API чтения DataFrame для чтения
TABLES
,VIEWS
и ad-hocSELECT
запросов как DataFrames - API записи DataFrame для записи DataFrames как
TABLES
- Поддерживает как табличную, так и инкрементальную материализацию
Настройка
Необходимые роли
- Пользователь должен быть не-ADMIN для выполнения функции Python
- Пользователю должна быть предоставлена роль
OML_DEVELOPER