開発者ガイド - CData Python コネクタ & SQLAlchemy
SQLAlchemy は、Python 向けの強力な SQL ツールキットおよびオブジェクト・リレーショナル・マッパー (ORM) です。SQL の抽象化レイヤーを提供することで、データベースとの連携を効率的かつ体系的に行うことができます。
SQLAlchemy の主な特長は以下のとおりです。
- ORM とコア SQL のサポート: ORM ベースのクエリと生の SQL ベースのクエリの両方をサポートしています。
- データベース非依存: ダイアレクトシステムを通じて、さまざまなリレーショナルデータベースで動作します。
- 遅延ロードと即時ロード: クエリ実行を最適化し、パフォーマンスを向上させます。
- 接続プーリング: データベース接続を効率的に管理し、オーバーヘッドを最小化してパフォーマンスを向上させます。
- 宣言型マッピング: Python クラスを使用してデータベースモデルを定義します。
CData Python コネクタと SQLAlchemy を組み合わせるメリット
CData Python コネクタは、SQLAlchemy フレームワークの機能を拡張・強化し、SaaS アプリケーション、ERP スイート、ビッグデータプラットフォーム、NoSQL システムなど、270 以上のデータソースへのリアルタイム接続を実現します。複雑な API 連携、カスタムスクリプト、サードパーティライブラリは一切不要です。
標準的な SQL-92 インターフェースにより、一貫したクエリ言語、プッシュダウンクエリ処理、メタデータ検出、インテリジェントなクライアント側実行が提供されるため、プロトコル固有のリクエストが不要になります。さらに、組み込みの最適化されたデータ処理により、ライブデータへのアクセスで比類のないパフォーマンスを実現します。
CData Python コネクタの主な特長
- 構造化 SQL クエリ: リレーショナルおよび非リレーショナルデータソースに対して、シームレスに SQL クエリを実行できます。
- リアルタイムデータアクセス: データのレプリケーションなしでライブデータを取得し、常に最新のインサイトを得られます。
- 高度な SQL 機能: JOIN、集計、グルーピング関数、その他の複雑なクエリを簡単に実行できます。
- 最適化されたパフォーマンス: プッシュダウンクエリ処理により、サポートされている操作をソース側で実行し、レイテンシを最小化します。
- シームレスな ORM 連携: SQLAlchemy の ORM を活用して、マッピングされたクラスでさまざまなデータソースを操作できます。
- クロスプラットフォーム対応: Windows、macOS、Linux で動作し、柔軟なデプロイが可能です。
- 統一されたデータベース操作: 複数のプラットフォームにわたってクエリとデータ操作を標準化します。
- スケーラブルで効率的: インテリジェントなクエリ実行とメタデータ検出により、パフォーマンスを向上させます。
SQLAlchemy と CData Python コネクタの使い方
それでは、CData Python コネクタの動作を例を使って見ていきましょう。
ここでは、CSV ファイルが格納されているパスをユーザーに入力してもらい、ファイルの内容を表示してから INNER JOIN を実行する Python スクリプトを作成します。
この例では、CData Python Connector for CSV、フルライセンスまたは無料のコミュニティライセンス、そしてローカルディレクトリ(例: C:\Users\Public\Downloads\CSV Folder)に保存された CSV ファイル(ZIP ダウンロード)を使用します。
補足: 以下のコードでは、create_engine 関数で使用する接続文字列に RowScanDepth というプロパティを含めています。このオプションのプロパティは、CSV ファイルのようにメタデータを自動的に含まないデータソースのカラム構造を動的に決定する際にスキャンする行数を定義します。値を大きくすると精度が向上しますが、処理時間が長くなる可能性があります。0 に設定すると CSV ファイル全体をスキャンし、デフォルトは 100 です。
以下のコードをお好みのテキストエディタまたは IDE に貼り付けて実行してみてください。
import os
import warnings
import pandas as pd
from sqlalchemy import create_engine
# 警告を抑制
warnings.filterwarnings("ignore", category=DeprecationWarning)
# CSV ディレクトリパスを取得して検証
csv_path = input("Enter the CSV directory path: ").strip()
if not os.path.isdir(csv_path):
exit("Error: Directory does not exist.")
# CSV ディレクトリに接続するための SQLAlchemy エンジンを作成
engine = create_engine(f"csv:///?URI={csv_path};RowScanDepth=0")
# 利用可能な CSV ファイルを取得
tables_df = pd.read_sql("SELECT * FROM sys_tables", engine)
if tables_df.empty or "TableName" not in tables_df.columns:
print("Error: No CSV files found.")
exit()
# 利用可能な CSV ファイルを表示
print("\nAvailable CSV files:")
for i, row in tables_df.iterrows():
print(f"{i+1}. {row['TableName']}")
# 最初のテーブルを選択
try:
table_choice1 = int(input("\nSelect the first table number: ")) - 1
table1 = tables_df.at[table_choice1, "TableName"]
except (ValueError, IndexError):
print("Error: Invalid selection.")
exit()
# 選択したテーブルのデータを表示
df1 = pd.read_sql(f'SELECT * FROM "{table1}"', engine)
print(f"\nSample Data from '{table1}':\n", df1.head())
# 2番目のテーブルを選択
try:
table_choice2 = int(input("\nSelect the second table number for JOIN: ")) - 1
table2 = tables_df.at[table_choice2, "TableName"]
except (ValueError, IndexError):
print("Error: Invalid selection.")
exit()
# 両方のテーブルの利用可能なカラムを表示
columns1 = pd.read_sql(f"SELECT ColumnName FROM sys_tablecolumns WHERE TableName = '{table1}'", engine)["ColumnName"].tolist()
columns2 = pd.read_sql(f"SELECT ColumnName FROM sys_tablecolumns WHERE TableName = '{table2}'", engine)["ColumnName"].tolist()
print(f"\nColumns in '{table1}': {columns1}")
print(f"Columns in '{table2}': {columns2}")
# JOIN に使用するカラムをユーザーに確認
join_column1 = input(f"\nEnter the column from '{table1}' to JOIN on: ").strip()
# カラム選択を検証
if join_column1 not in columns1:
print(f"Error: Column '{join_column1}' not found in '{table1}'.")
exit()
join_column2 = input(f"\nEnter the column from '{table2}' to JOIN on: ").strip()
# カラム選択を検証
if join_column2 not in columns2:
print(f"Error: Column '{join_column2}' not found in '{table2}'.")
exit()
# JOIN クエリを実行
query = f"""
SELECT *
FROM "{table1}" AS t1
INNER JOIN "{table2}" AS t2
ON t1."{join_column1}" = t2."{join_column2}"
"""
try:
joined_df = pd.read_sql(query, engine)
print("\nJoined Data:\n", joined_df.head())
except Exception as e:
print("Error executing JOIN:", str(e))
スクリプトを実行すると、以下の操作を求められます。
- ディレクトリパスの入力: CSV ファイルが格納されているディレクトリのパスを入力します。
- 2つの CSV ファイルの選択: 利用可能なテーブルのリストから2つの CSV ファイルを選択します。
- 対応するカラムの選択: JOIN を実行するために両方のテーブルから対応するカラムを選択します。
- スクリプトは選択したカラムで INNER JOIN を実行し、結合されたデータセットを表示します。
このコードはどのように動作するのか?
このスクリプトは、SQLAlchemy と CData Python コネクタを使用して、CSV ファイルをデータベーステーブルのようにクエリする方法を示しています。
- SQLAlchemy エンジン: create_engine 関数は、CSV ファイルを含むディレクトリへの接続を作成します。
- CSV ファイルの読み取り: スクリプトは sys_tables を使用して利用可能な CSV ファイルを取得します。
- データプレビュー: 選択した CSV ファイルのサンプルをプレビューできます。
- SQL JOIN の実行: スクリプトは JOIN に使用する共通カラムを検証し、INNER JOIN を実行して、選択したカラムに基づいて一致する行のみを取得します。
- エラーハンドリング: ユーザー入力を検証し、JOIN を実行する前に選択したカラムが両方のテーブルに存在することを確認します。
このアプローチにより、CSV ファイルをリレーショナルデータベースのテーブルのように扱い、SQL を使用して操作できるようになります。
データ開発者向けの無料コミュニティライセンス
CData Python コネクタは、従来のデータベースに加え、SaaS、NoSQL、ビッグデータシステムなど 270 以上のデータソースへの一貫した SQL ベースの接続を提供することで、Python DB-API と SQLAlchemy の機能をさらに強化します。
CData Python コミュニティライセンスを取得すると、個人の Python プロジェクトでデータにアクセスするためのライブラリを永久無料で利用できます。すべて使い慣れた SQL で操作可能です。ライセンスをリクエストして、より優れたデータ連携プロジェクトを今すぐ始めましょう。