DatabricksでSQLAlchemyを使用する
Databricks は、Databricks の SQLAlchemy 方言 (SQLAlchemy がさまざまな種類のデータベース API 実装およびデータベースと通信するために使用するシステム) を提供します。 SQLAlchemyは、Python SQLツールキットおよびオブジェクトリレーショナルマッパー(ORM)です。 SQLAlchemyは、効率的で高パフォーマンスのデータベースアクセスのために設計された、よく知られたエンタープライズレベルの永続性パターンのスイートを提供し、単純なPythonドメイン言語に適応しています。 「機能と哲学」を参照してください。
Databricks で SQLAlchemy 機能を使用するには、Databricks の SQLAlchemy 言語をインストールする必要があります。 この記事では、Databricks SQL Connector for Python バージョン 4.0.0 以降に基づく Databricks バージョン 1.0 および 2.0 の SQLAlchemy 方言について説明します。
必要条件
- Python >=3.8 および <=3.11 を実行している開発マシン。
- Databricks では、Python に含まれている venv によって提供される環境など、Python 仮想環境を使用することをお勧めします。 仮想環境は、正しいバージョンの Python と Databricks SQL Connector for Python を一緒に使用していることを確認するのに役立ちます。 仮想環境の設定と使用については、この記事の範囲外です。 詳細については、「 仮想環境の作成」を参照してください。
- 既存の クラスター または SQLウェアハウス。
はじめに
pip install databricks-sqlalchemy~=1.0を使用して SQLAlchemy v1 に databricks-sqlalchemy をインストールするか、pip install databricks-sqlalchemyを使用して SQLAlchemy v2 をインストールします。バージョン情報については、 databricks-sqlalchemy のリリース履歴を参照してください。- 使用するクラスターまたは SQLウェアハウスについて、次の情報を収集します。
- Cluster
- SQL warehouse
- クラスターのサーバ・ホスト名。 これは、クラスターの[Advanced OptionsJDBC (詳細オプション)]ODBC > / タブの[Server Hostname (サーバー ホスト名)] の値から取得できます。
- クラスタリングの HTTP パス。 これは、クラスタリングの[Advanced OptionsJDBC ODBC (詳細オプション)] > / タブの[HTTP Path (HTTP パス)] の値から取得できます。
認証
Databricks の SQLAlchemy ダイアレクトは、Databricks SQL Connector for Python を使用して接続し、 connect_args の値をコネクタに渡します。これは次の認証タイプをサポートします。
個人用アクセストークン認証
Databricksの個人アクセス ノートを作成するには、 「ワークスペース ユーザー向けの個人アクセス ノートを作成する」のステップに従います。
SQLAlchemy ダイアレクトを認証するには、次のコードスニペットを使用します。 このスニペットは、次の環境変数を設定していることを前提としています。
DATABRICKS_TOKENで、Databricks 個人用アクセス トークンに設定されます。DATABRICKS_SERVER_HOSTNAMEクラスターまたはウェアハウスの Server Hostname 値 SQLに設定します。DATABRICKS_HTTP_PATHで、クラスターまたはSQL ウェアハウスの HTTP パス 値に設定します。DATABRICKS_CATALOGで、Unity Catalog のターゲット カタログに設定します。DATABRICKS_SCHEMAは、Unity Catalog のターゲット スキーマ (データベースとも呼ばれます) に設定されます。
環境変数を設定するには、オペレーティングシステムのドキュメントを参照してください。
import os
from sqlalchemy import create_engine
access_token = os.getenv("DATABRICKS_TOKEN")
server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME")
http_path = os.getenv("DATABRICKS_HTTP_PATH")
catalog = os.getenv("DATABRICKS_CATALOG")
schema = os.getenv("DATABRICKS_SCHEMA")
engine = create_engine(
url = f"databricks://token:{access_token}@{server_hostname}?" +
f"http_path={http_path}&catalog={catalog}&schema={schema}"
)
# ...
前述の engine 変数を使用して、 Databricks コンピュート リソースを介して指定したカタログとスキーマに接続します。
OAuth ユーザーマシン間 (U2M) 認証
OAuth U2M認証では、リアルタイムの人間によるサインインと同意を使用して、ターゲットの Databricks ユーザーアカウントを認証します。各クラウドでサポートされている Databricks SQL Connector for Python バージョンについては、「 OAuth ユーザーマシン間 (U2M) 認証」を参照してください。
SQLAlchemyダイアレクトをOAuth U2Mで認証するには、以下のコードスニペットを使用します。このスニペットでは、個人用アクセストークン認証で説明されているように、DATABRICKS_SERVER_HOSTNAME、DATABRICKS_HTTP_PATH、DATABRICKS_CATALOG、および DATABRICKS_SCHEMA 環境変数を設定していることを前提としています。
import os
from sqlalchemy import create_engine
server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME")
http_path = os.getenv("DATABRICKS_HTTP_PATH")
catalog = os.getenv("DATABRICKS_CATALOG")
schema = os.getenv("DATABRICKS_SCHEMA")
engine = create_engine(
url = f"databricks://{server_hostname}?" +
f"http_path={http_path}&catalog={catalog}&schema={schema}",
connect_args = {"auth_type": "databricks-oauth"}
)
# ...
OAuthマシン間 (M2M) 認証
OAuth M2M認証は、Databricks Service Principalとして認証します。また、Databricks SDK for Pythonもインストールする必要があります(例えば、pip install databricks-sdkを実行してインストールします)。各クラウドでサポートされている Databricks SQL Connector for Python および SDK バージョンについては、「 OAuth マシン間 (M2M) 認証」を参照してください。
OAuth M2M認証を使用するには、次の手順を実行します。
- DatabricksワークスペースにDatabricks Service Principalを作成し、そのService PrincipalのOAuthシークレットを作成します。OAuth を使用した Databricks への Databricks Service Principal アクセスの承認を参照してください。
- Service Principalに、クラスターまたはSQL Warehouseへのアクセス権を付与します。コンピュートの権限またはSQLウェアハウスの管理を参照してください。
OAuth M2M で SQLAlchemy ダイアレクトを認証するには、次のコードスニペットを使用します。このスニペットは、 DATABRICKS_SERVER_HOSTNAME 、 DATABRICKS_HTTP_PATH 、 DATABRICKS_CATALOG 、および DATABRICKS_SCHEMA 環境変数に加えて、次の環境変数を設定していることを前提としています。
DATABRICKS_CLIENT_ID、Service Principalの UUID または Application ID の値に設定されます。DATABRICKS_CLIENT_SECRETをService PrincipalのOAuthシークレットの シークレット の値に設定します。
import os
from databricks.sdk.core import Config, oauth_service_principal
from sqlalchemy import create_engine
server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME")
http_path = os.getenv("DATABRICKS_HTTP_PATH")
catalog = os.getenv("DATABRICKS_CATALOG")
schema = os.getenv("DATABRICKS_SCHEMA")
def credential_provider():
config = Config(
host = f"https://{server_hostname}",
client_id = os.getenv("DATABRICKS_CLIENT_ID"),
client_secret = os.getenv("DATABRICKS_CLIENT_SECRET"))
return oauth_service_principal(config)
engine = create_engine(
url = f"databricks://{server_hostname}?" +
f"http_path={http_path}&catalog={catalog}&schema={schema}",
connect_args = {"credentials_provider": credential_provider}
)
# ...
SQLAlchemy v1 (英語)
接続例については、こちらを参照してください example.py
SQLAlchemy v2 (英語)
接続の例については、次のセクションと GitHub の sqlalchemy_example.py ファイルを参照してください。
DBAPI リファレンス
- Databricks - sqlalchemy v1 GitHubリポジトリ
- SQLAlchemy v1 README.md
- Databricks - SQLALCHEMYのV2 GitHubリポジトリ
- SQLAlchemy v2 README.md