開発者ガイド - CData Python Connectors と petl
この記事では、CData Python Connector for CSV を使って、petl で CSV データを SQLite データベースにレプリケーションする方法をご紹介します。このガイドでは、CSV ファイルが格納されたフォルダへのパスをユーザーに入力してもらい、利用可能なテーブルを一覧表示し、選択されたテーブルのデータを表示する Python スクリプトを作成します。
この記事では CData Python Connector for CSV を取り上げていますが、同じ方法を CData がサポートする 270 以上のデータソースに適用できます。
完成版スクリプトはこちら:完全なスクリプト
前提条件
このガイドを進めるには、以下の前提条件を満たす必要があります。
- CData Python Connector for CSV
- Python 3.8、3.9、3.10、3.11、または 3.12
- 読み取り権限でアクセス可能な CSV ファイル:サンプル CSV ファイル(ZIP 形式でダウンロード可能)
ステップバイステップガイド
-
必要なモジュールをインストールする
ターミナルで「pip」ユーティリティを使用して petl モジュールをインストールします。
pip install petl -
Python ファイルを作成してモジュールをインポートする
新しい Python ファイルを作成し、以下の import 文を追加します。
import cdata.csv as csv_mod # CData CSV モジュールをインポート import petl as etl import sqlite3 as db_mod -
CSV ファイルへのパスを入力してもらう
csv_path = input("Enter the full path to the directory containing your CSV file(s), for example 'C:/Users/Public/CSVFiles':") -
CData Python Connector を使用して CSV ディレクトリへの接続を作成する
csv_cnxn_str = f"URI={csv_path};RowScanDepth=0" csv_cnxn = csv_mod.connect(csv_cnxn_str);注:「RowScanDepth」プロパティを設定することで、行をスキャンする際に CSV ファイル全体を解析し、カラム名とデータ型を動的に決定できます。ドキュメント全体をスキャンするため時間がかかる場合がありますが、データモデルをより正確に反映したカラムデータ型を取得できます。
-
利用可能なテーブルを一覧表示する
接続で利用可能なテーブルを一覧表示するには、「sys_tables」システムテーブルにクエリを実行し、その結果を表示します。CSV 接続オブジェクトに対して SELECT クエリを実行してみましょう。
csv_cur = csv_cnxn.execute(f"SELECT TableName FROM sys_tables") table_names = csv_cur.fetchall() csv_cur.close() printf("\nAvailable tables:") for idx, table in enumerate(table_names, start=1): printf(f"{idx}. {table['TableName']}") -
テーブルを選択してもらう
テーブルが一覧表示されたら、新しい変数「table_index」を作成し、テーブル番号を入力してもらいます。その後、別の変数「selected_table」にテーブル名を格納します。
table_index = int(input("\nSelect a table number from above: "))–1 selected_table = table_names[table_index]['TableName'] -
メタデータを取得する
「sys_tablecolumns」システムテーブルを使用して、CSV ファイルからメタデータ(特にカラム名)を取得します。このカラム名を使用して、SQLite データベースに宛先テーブルを作成します。
csv_cur = csv_cnxn.execute(f"SELECT ColumnName FROM sys_tablecolumns WHERE TableName = '{table_name}'") csv_columns = csv_cur.fetchall() csv_cur.close() -
データベースへのパスを入力してもらう
宛先データベースへのパスを入力してもらいます。データベースが存在しない場合、SQLite3 モジュールが自動的に作成します。
db_path = input("\nPlease input the path to the directory for your SQLite database: ") db_cnxn = db_mod.connect(f"{db_path}/csv_data.db") db_cur = db_cnxn.cursor() -
ターゲットデータベースを構成する
これで、レプリケーションするデータのメタデータに基づいて SQLite データベースに新しいテーブルを作成する準備が整いました。ソース CSV ファイルのカラム名を使用して CREATE 文のカラム定義部分を生成し、簡略化のため各カラム型を TEXT に設定します。
create_columns_part = ", ".join([f'"{col["ColumnName"]}" TEXT' for col in csv_columns]) db_cur.execute(f'CREATE TABLE IF NOT EXISTS [{table_name}] ({create_columns_part})') db_cur.close() -
CSV データをデータベースにレプリケーションする
最後に、petl モジュールと CData Python Connector を使用して CSV ファイルからデータをクエリし、SQLite データベーステーブルにデータを追加します。
csv_data = etl.fromdb(csv_cnxn,f"SELECT * FROM [{table_name}]") etl.appenddb(csv_data, db_cnxn, table_name)
データベースを確認する方法
SQLite データベースを確認するには、以下の手順に従ってください。
-
SQLite Viewer 拡張機能をインストールする
VS Code に SQLite Viewer 拡張機能をインストールするか、別のデータベースビューアをお使いください。
-
データベースを開く
csv_data.db ファイルを右クリックし、「ファイルを開くアプリケーションの選択」から「VS Code」(またはインストール済みの SQLite ビューア)を選択します。
データ開発者向け無料コミュニティライセンス
CData Python Connectors は、従来のデータベースだけでなく、SaaS、NoSQL、ビッグデータシステムなど 270 以上のデータソースに対して、一貫した SQL ベースの接続性を提供することで、Python DB-API と petl の機能をさらに強化します。 CData Python コミュニティライセンスを使用すると、個人の Python プロジェクトでデータにアクセスするためのライブラリを無料で永続的にご利用いただけます。すべて使い慣れた SQL を通じてアクセス可能です。今すぐライセンスをリクエストして、より接続性に優れたプロジェクトを作成しましょう!
完全なスクリプト
import cdata.csv as csv_mod
import petl as etl
import sqlite3 as db_mod
csv_path = input("\nPlease input the path to the directory for your CSV file(s): ")
csv_cnxn_string = f"URI={csv_path};RowScanDepth=0"
csv_cnxn = csv_mod.connect(csv_cnxn_string)
csv_cur = csv_cnxn.execute("SELECT TableName FROM sys_tables")
rs = csv_cur.fetchall()
csv_cur.close()
print("\nAvailable Tales")
for idx, row in enumerate(rs, start=1):
print(f"{idx}. {row['TableName']}")
table_index = int(input("\nSelect a table number from above: "))-1
table_name = rs[table_index]['TableName']
csv_cur = csv_cnxn.execute(f"SELECT ColumnName FROM sys_tablecolumns WHERE TableName = '{table_name}'")
csv_columns = csv_cur.fetchall()
csv_cur.close()
db_path = input("\nPlease input the path to the directory for your SQLite database: ")
db_cnxn = db_mod.connect(f"{db_path}/csv_data.db")
db_cur = db_cnxn.cursor()
# CSV 構造に基づいてテーブルを作成(簡略化のためすべてのカラムを text と仮定)
create_columns_part = ", ".join([f'"{col["ColumnName"]}" TEXT' for col in csv_columns])
db_cur.execute(f'CREATE TABLE IF NOT EXISTS [{table_name}] ({create_columns_part})')
db_cur.close()
csv_data = etl.fromdb(csv_cnxn,f"SELECT * FROM [{table_name}]")
# SQLite データベースにデータを追加
etl.appenddb(csv_data, db_cnxn, table_name)