Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

chDB Python API リファレンス

主要なクエリ関数

chdb.query

chDBエンジンを使用してSQLクエリを実行します。

これは、埋め込み ClickHouse エンジンを使用してSQLステートメントを実行する主要なクエリ関数です。さまざまな出力フォーマットをサポートし、一時 データベースまたはファイルベースのデータベースで動作します。

構文

chdb.query(sql, output_format='CSV', path='', udf_path='')

パラメータ

Parameter Type Default Description
sql str required 実行する SQL クエリ文字列
output_format str "CSV" 結果の出力フォーマット。対応フォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"Arrow" - Apache Arrow フォーマット
"Parquet" - Parquet フォーマット
"DataFrame" - Pandas DataFrame
"ArrowTable" - PyArrow Table
"Debug" - 詳細なロギングを有効化
path str "" データベースファイルのパス。デフォルトでは一時的な非永続データベース (":memory:" と同等) が使用されます。
ディスクに永続化するにはファイルパスを指定します
udf_path str "" レガシーなサブプロセスベースの UDF ディレクトリへのパス。ネイティブ Python UDF (@func / create_function) には不要です

戻り値

指定したフォーマットでクエリ結果を返します。

Return Type Condition
str CSV、JSON などのテキストフォーマットの場合
pd.DataFrame output_format"DataFrame" または "dataframe" の場合
pa.Table output_format"ArrowTable" または "arrowtable" の場合
chdb result object その他のフォーマットの場合

送出される例外

Exception Condition
ChdbError SQL クエリの実行に失敗した場合
ImportError DataFrame/Arrow フォーマットに必要な依存関係が不足している場合

>>> # Basic CSV query
>>> result = chdb.query("SELECT 1, 'hello'")
>>> print(result)
"1,hello"
>>> # Query with DataFrame output
>>> df = chdb.query("SELECT 1 as id, 'hello' as msg", "DataFrame")
>>> print(df)
   id    msg
0   1  hello
>>> # Query with file-based database
>>> result = chdb.query("CREATE TABLE test (id INT) ENGINE = Memory", path="mydb.chdb")

chdb.sql

chDB エンジンを使用してSQLクエリを実行します。

これは、埋め込みClickHouse エンジンを使用してSQLステートメントを実行する主要なクエリ関数です。さまざまな出力フォーマットをサポートし、一時データベースまたはファイルベースのデータベースで使用できます。

構文

chdb.sql(sql, output_format='CSV', path='', udf_path='')

パラメータ

Parameter Type Default Description
sql str required 実行する SQL クエリ文字列
output_format str "CSV" 結果の出力フォーマット。対応フォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"Arrow" - Apache Arrow フォーマット
"Parquet" - Parquet フォーマット
"DataFrame" - Pandas DataFrame
"ArrowTable" - PyArrow Table
"Debug" - 詳細なロギングを有効にする
path str "" データベースファイルのパス。デフォルトでは一時的で永続化されないデータベース (":memory:" と同等) を使用します。
ディスクに永続化するにはファイルパスを指定します
udf_path str "" レガシーなサブプロセスベースの UDF ディレクトリのパス。ネイティブ Python UDF (@func / create_function) では不要です

戻り値

指定したフォーマットでクエリ結果を返します。

Return Type Condition
str CSV、JSON などのテキストフォーマットの場合
pd.DataFrame output_format"DataFrame" または "dataframe" の場合
pa.Table output_format"ArrowTable" または "arrowtable" の場合
chdb result object その他のフォーマットの場合

送出される例外

Exception Condition
ChdbError SQL クエリの実行に失敗した場合
ImportError DataFrame/Arrow フォーマットに必要な依存関係が不足している場合

>>> # Basic CSV query
>>> result = chdb.query("SELECT 1, 'hello'")
>>> print(result)
"1,hello"
>>> # Query with DataFrame output
>>> df = chdb.query("SELECT 1 as id, 'hello' as msg", "DataFrame")
>>> print(df)
   id    msg
0   1  hello
>>> # Query with file-based database
>>> result = chdb.query("CREATE TABLE test (id INT) ENGINE = Memory", path="mydb.chdb")

chdb.to_arrowTable

クエリ結果を PyArrow Table に変換します。

chDB のクエリ結果を、効率的な列指向データ処理のための PyArrow Table に変換します。 結果が空の場合は、空のテーブルを返します。

構文

chdb.to_arrowTable(res)

パラメータ

パラメータ 説明
res バイナリ形式のArrowデータを含む、chDBのクエリ結果オブジェクト

戻り値

戻り値の型 説明
pa.Table クエリ結果を含むPyArrow Table

送出される例外

エラーの型 説明
ImportError pyarrow または pandas がインストールされていない場合

>>> result = chdb.query("SELECT 1 as id, 'hello' as msg", "Arrow")
>>> table = chdb.to_arrowTable(result)
>>> print(table.to_pandas())
   id    msg
0   1  hello

chdb.to_df

クエリ結果を pandas DataFrame に変換します。

chDB のクエリ結果を、まず PyArrow Table に変換し、次にマルチスレッドを使用して pandas DataFrame に変換することで、パフォーマンスを向上させます。

構文

chdb.to_df(r)

パラメータ

パラメータ 説明
r バイナリ形式のArrowデータを含む chDB のクエリ結果オブジェクト

戻り値

戻り値の型 説明
pd.DataFrame クエリ結果が格納された pandas DataFrame

送出される例外

例外 条件
ImportError pyarrow または pandas がインストールされていない場合

>>> result = chdb.query("SELECT 1 as id, 'hello' as msg", "Arrow")
>>> df = chdb.to_df(result)
>>> print(df)
   id    msg
0   1  hello

接続とセッション管理

以下のセッション関数を使用できます:

chdb.connect

chDB バックグラウンドサーバーへの接続を作成します。

この関数は、chDB (ClickHouse) データベースエンジンへの Connection を確立します。 各呼び出しは独立した接続を返し、同じデータベースパスに対して複数の接続を同時に開くことができます。

chdb.connect(connection_string: str = ':memory:') → Connection

パラメータ:

パラメータ Type Default 説明
connection_string str ":memory:" データベースの接続文字列。以下のフォーマットを参照してください。

基本的なフォーマット

フォーマット 説明
":memory:" 一時データベース (デフォルト)
"test.db" 相対パスのデータベースファイル
"file:test.db" 相対パスと同じ
"/path/to/test.db" 絶対パスのデータベースファイル
"file:/path/to/test.db" 絶対パスと同じ

クエリパラメータ付き

フォーマット 説明
"file:test.db?param1=value1&param2=value2" パラメータ付きの相対パス
"file::memory:?verbose&log-level=test" パラメータ付きの一時データベース
"///path/to/test.db?param1=value1&param2=value2" パラメータ付きの絶対パス

クエリパラメータの処理

クエリパラメータは起動引数として ClickHouse エンジン に渡されます。 特殊なパラメータの処理:

特殊パラメータ 変換後 説明
mode=ro --readonly=1 読み取り専用モード
verbose (flag) 詳細なロギングを有効化
log-level=test (setting) ログレベルを設定

完全なパラメータ一覧については、clickhouse local --help --verbose を参照してください

戻り値

Return Type 説明
Connection 次をサポートするデータベース接続オブジェクト:
Connection.cursor() によるカーソルの作成
Connection.query() による直接クエリ
Connection.send_query() によるストリーミングクエリ
• 自動クリーンアップのためのコンテキストマネージャープロトコル

送出される例外

Exception 条件
RuntimeError データベースへの接続に失敗した場合

>>> # Temporary database
>>> conn = connect()
>>> conn = connect(":memory:")
>>>
>>> # File-based database
>>> conn = connect("my_data.db")
>>> conn = connect("/path/to/data.db")
>>>
>>> # With parameters
>>> conn = connect("data.db?mode=ro")  # Read-only mode
>>> conn = connect(":memory:?verbose&log-level=debug")  # Debug logging
>>>
>>> # Using context manager for automatic cleanup
>>> with connect("data.db") as conn:
...     result = conn.query("SELECT 1")
...     print(result)
>>> # Connection automatically closed

関連項目

  • Connection - データベース接続を表すクラス
  • Cursor - DB-API 2.0 操作用のデータベースカーソル

例外処理

class chdb.ChdbError

基底: Exception

chDB 関連のエラーに対する基本例外クラスです。

この例外は、chDB のクエリ実行に失敗した場合や、 エラーが発生した場合に送出されます。標準の Python の Exception クラスを継承しており、 基盤となる ClickHouse エンジンからのエラー情報を提供します。


class chdb.session.Session

基底クラス: object

セッションはクエリの状態を保持します。 path が None の場合、セッションはプロセス全体で共有される一時的な (:memory:) データベースを使用するため、path を指定しないすべてのセッションは互いのテーブルを参照できます。その一時ディレクトリは、そのような最後のセッションまたは接続が閉じられた場合にのみ削除されます。 パスを指定して、その場所にデータを保持するデータベースを作成することもできます。

接続文字列を使って、path やその他のパラメータを渡すこともできます。

class chdb.session.Session(path=None)

Connection String 説明
":memory:" 一時データベース
"test.db" 相対パス
"file:test.db" 上記と同じ
"/path/to/test.db" 絶対パス
"file:/path/to/test.db" 上記と同じ
"file:test.db?param1=value1&param2=value2" クエリパラメータ付きの相対パス
"file::memory:?verbose&log-level=test" クエリパラメータ付きの一時データベース
"///path/to/test.db?param1=value1&param2=value2" クエリパラメータ付きの絶対パス

cleanup

例外を処理しながらセッションリソースをクリーンアップします。

このメソッドは、クリーンアップ処理中に発生する可能性のある例外を抑制しつつ、 セッションを閉じようとします。特に、エラー処理の場面や、セッションの状態に関係なく クリーンアップが確実に実行されるようにする必要がある場合に有用です。

構文

cleanup()

>>> session = Session("test.db")
>>> try:
...     session.query("INVALID SQL")
... finally:
...     session.cleanup()  # エラーが発生しても安全にクリーンアップ

関連項目

  • close() - セッションを明示的に終了し、エラーを伝播させる場合

close

セッションを閉じて、リソースを解放します。

このメソッドは内部の connection を閉じ、グローバルなセッション状態をリセットします。 このメソッドを呼び出すと、セッションは無効になり、以降の クエリには使用できなくなります。

構文

close()

>>> session = Session("test.db")
>>> session.query("SELECT 1")
>>> session.close()  # セッションを明示的に閉じる

query

SQLクエリを実行して、結果を返します。

このメソッドは、セッションのデータベースに対してSQLクエリを実行し、 指定したフォーマットで結果を返します。さまざまな出力フォーマットをサポートし、 クエリ間でセッションの状態を維持します。

構文

query(sql, fmt='CSV', udf_path='')

パラメータ

Parameter Type Default Description
sql str required 実行する SQL クエリ文字列
fmt str "CSV" 結果の出力フォーマット。使用可能なフォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"TabSeparated" - タブ区切り値
"Pretty" - 整形済みのテーブルフォーマット
"JSONCompact" - コンパクトな JSON フォーマット
"Arrow" - Apache Arrow フォーマット
"Parquet" - Parquet フォーマット
udf_path str "" レガシーなサブプロセスベースの UDF ディレクトリへのパス。ネイティブ Python UDF (@func / create_function) には不要です。指定しない場合は、セッション初期化時の UDF パスを使用します

戻り値

指定したフォーマットでクエリ結果を返します。 戻り値の型は fmt パラメータによって異なります。

  • 文字列フォーマット (CSV、JSON など) の場合は str を返します
  • バイナリ形式 (Arrow、Parquet) の場合は bytes を返します

送出される例外

Exception Condition
RuntimeError セッションが閉じられているか無効な場合
ValueError SQL クエリの形式が正しくない場合

>>> session = Session("test.db")
>>>
>>> # Basic query with default CSV format
>>> result = session.query("SELECT 1 as number")
>>> print(result)
number
1
>>> # Query with JSON format
>>> result = session.query("SELECT 1 as number", fmt="JSON")
>>> print(result)
{"number": "1"}
>>> # Complex query with table creation
>>> session.query("CREATE TABLE test (id INT, name String) ENGINE = Memory")
>>> session.query("INSERT INTO test VALUES (1, 'Alice'), (2, 'Bob')")
>>> result = session.query("SELECT * FROM test ORDER BY id")
>>> print(result)
id,name
1,Alice
2,Bob

関連項目

  • send_query() - クエリをストリーミング実行する場合
  • sql - このメソッドのエイリアス

send_query

SQLクエリを実行し、ストリーミング結果イテレータを返します。

このメソッドはセッションのデータベースに対してSQLクエリを実行し、 結果全体を一度にメモリへ読み込むことなく、結果を順に反復処理できる ストリーミング結果オブジェクトを返します。これは特に大きな結果セットで 有用です。

構文

send_query(sql, fmt='CSV') → StreamingResult

パラメータ

Parameter Type Default Description
sql str required 実行する SQL クエリ文字列
fmt str "CSV" 結果の出力フォーマット。使用可能なフォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"TabSeparated" - タブ区切り値
"JSONCompact" - コンパクトな JSON フォーマット
"Arrow" - Apache Arrow フォーマット
"Parquet" - Parquet フォーマット

戻り値

Return Type Description
StreamingResult クエリ結果を逐次返すストリーミング結果イテレータ。for ループで使用したり、他のデータ構造に変換したりできます

送出される例外

Exception Condition
RuntimeError セッションが閉じているか無効な場合
ValueError SQL クエリの形式が正しくない場合

>>> session = Session("test.db")
>>> session.query("CREATE TABLE big_table (id INT, data String) ENGINE = MergeTree() order by id")
>>>
>>> # 大規模なデータセットを挿入する
>>> for i in range(1000):
...     session.query(f"INSERT INTO big_table VALUES ({i}, 'data_{i}')")
>>>
>>> # メモリ使用量を抑えるために結果をストリーミングする
>>> streaming_result = session.send_query("SELECT * FROM big_table ORDER BY id")
>>> for chunk in streaming_result:
...     print(f"Processing chunk: {len(chunk)} bytes")
...     # 結果セット全体をメモリに読み込まずにchunkを処理する
>>> # Using with context manager
>>> with session.send_query("SELECT COUNT(*) FROM big_table") as stream:
...     for result in stream:
...         print(f"Count result: {result}")

関連項目

  • query() - 非ストリーミングのクエリ実行向け
  • chdb.state.sqlitelike.StreamingResult - ストリーミング結果のイテレータ

sql

SQLクエリを実行し、結果を返します。

このメソッドは、セッションのデータベースに対してSQLクエリを実行し、 指定したフォーマットで結果を返します。さまざまな出力フォーマットをサポートし、 クエリ間でセッションの状態を維持します。

構文

sql(sql, fmt='CSV', udf_path='')

パラメータ

Parameter デフォルト 説明
sql str required 実行する SQL クエリ文字列
fmt str "CSV" 結果の出力フォーマット。使用可能なフォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"TabSeparated" - タブ区切り値
"Pretty" - 整形済みのテーブルフォーマット
"JSONCompact" - コンパクトな JSON フォーマット
"Arrow" - Apache Arrow フォーマット
"Parquet" - Parquet フォーマット
udf_path str "" レガシーなサブプロセスベースの UDF ディレクトリへのパス。ネイティブ Python UDF (@func / create_function) には不要です。指定しない場合は、セッション初期化時の UDF パスを使用します

戻り値

指定したフォーマットでクエリ結果を返します。 戻り値の型は fmt パラメータによって異なります。

  • 文字列フォーマット (CSV、JSON など) の場合は str を返します
  • バイナリ形式 (Arrow、Parquet) の場合は bytes を返します

送出される例外:

例外 条件
RuntimeError セッションが閉じているか無効な場合
ValueError SQL クエリの形式が不正な場合

>>> session = Session("test.db")
>>>
>>> # Basic query with default CSV format
>>> result = session.query("SELECT 1 as number")
>>> print(result)
number
1
>>> # Query with JSON format
>>> result = session.query("SELECT 1 as number", fmt="JSON")
>>> print(result)
{"number": "1"}
>>> # Complex query with table creation
>>> session.query("CREATE TABLE test (id INT, name String) ENGINE = MergeTree() order by id")
>>> session.query("INSERT INTO test VALUES (1, 'Alice'), (2, 'Bob')")
>>> result = session.query("SELECT * FROM test ORDER BY id")
>>> print(result)
id,name
1,Alice
2,Bob

関連項目

  • send_query() - クエリをストリーミング実行する場合
  • sql - このメソッドの別名

状態管理

chdb.state.connect

chDB バックグラウンドサーバーへの Connection を作成します。

この関数は、chDB (ClickHouse) データベースエンジンへの 接続 を確立します。 呼び出すたびに独立した接続が返され、同じデータベース path への接続は同時にいくつでも開くことができます。

構文

chdb.state.connect(connection_string: str = ':memory:') → Connection

パラメータ

Parameter Type Default Description
connection_string(str, optional) str ":memory:" データベースの接続文字列です。以下のフォーマットを参照してください。

基本フォーマット

サポートされている接続文字列のフォーマット:

Format Description
":memory:" 一時データベース (デフォルト)
"test.db" 相対パスのデータベースファイル
"file:test.db" 相対パスと同じ
"/path/to/test.db" 絶対パスのデータベースファイル
"file:/path/to/test.db" 絶対パスと同じ

クエリパラメータ付き

Format Description
"file:test.db?param1=value1&param2=value2" パラメータ付きの相対パス
"file::memory:?verbose&log-level=test" パラメータ付きの一時データベース
"///path/to/test.db?param1=value1&param2=value2" パラメータ付きの絶対パス

クエリパラメータの処理

クエリパラメータは、起動引数として ClickHouse engine に渡されます。 特別なパラメータは次のように処理されます。

Special Parameter Becomes Description
mode=ro --readonly=1 読み取り専用モード
verbose (flag) 詳細ログを有効にする
log-level=test (setting) ログレベルを設定する

完全なパラメータ一覧については、clickhouse local --help --verbose を参照してください

戻り値

Return Type Description
Connection 次をサポートするデータベース接続オブジェクト:
Connection.cursor() によるカーソルの作成
Connection.query() による直接クエリの実行
Connection.send_query() によるストリーミングクエリ
• 自動クリーンアップのためのコンテキストマネージャープロトコル

送出される例外

Exception Condition
RuntimeError データベースへの接続に失敗した場合

>>> # Temporary database
>>> conn = connect()
>>> conn = connect(":memory:")
>>>
>>> # File-based database
>>> conn = connect("my_data.db")
>>> conn = connect("/path/to/data.db")
>>>
>>> # With parameters
>>> conn = connect("data.db?mode=ro")  # Read-only mode
>>> conn = connect(":memory:?verbose&log-level=debug")  # Debug logging
>>>
>>> # Using context manager for automatic cleanup
>>> with connect("data.db") as conn:
...     result = conn.query("SELECT 1")
...     print(result)
>>> # Connection automatically closed

関連項目

  • Connection - データベース接続のクラス
  • Cursor - DB-API 2.0 の操作用データベースカーソル

class chdb.state.sqlitelike.Connection

基底クラス: object

構文

class chdb.state.sqlitelike.Connection(connection_string: str)

close

接続を閉じて、リソースを解放します。

このメソッドはデータベース接続を閉じ、アクティブなカーソルを含む関連リソースを解放します。このメソッドを呼び出すと、接続は無効になり、以降の操作には使用できません。

構文

close() → None

>>> conn = connect("test.db")
>>> # クエリにコネクションを使用する
>>> conn.query("CREATE TABLE test (id INT) ENGINE = Memory")
>>> # 完了したら閉じる
>>> conn.close()
>>> # コンテキストマネージャーを使用(自動クリーンアップ)
>>> with connect("test.db") as conn:
...     conn.query("SELECT 1")
...     # 接続は自動的にクローズされる

cursor

クエリを実行するための Cursor オブジェクトを作成します。

このメソッドは、クエリの実行と結果の取得に使用する、標準的な DB-API 2.0 インターフェイスを備えたデータベースカーソルを作成します。 このカーソルにより、クエリの実行や 結果の取得をきめ細かく制御できます。

構文

cursor() → Cursor

戻り値

戻り値の型 説明
Cursor データベース操作用のカーソルオブジェクト

>>> conn = connect(":memory:")
>>> cursor = conn.cursor()
>>> cursor.execute("CREATE TABLE test (id INT, name String) ENGINE = Memory")
>>> cursor.execute("INSERT INTO test VALUES (1, 'Alice')")
>>> cursor.execute("SELECT * FROM test")
>>> rows = cursor.fetchall()
>>> print(rows)
((1, 'Alice'),)

関連項目

  • Cursor - データベースカーソルの実装

query

SQLクエリを実行し、結果セット全体を返します。

このメソッドは SQLクエリ を同期的に実行し、結果セット全体を返します。さまざまな出力フォーマットをサポートしており、フォーマット固有の後処理も自動的に適用されます。

構文

query(query: str, format: str = 'CSV') → Any

パラメータ:

Parameter Type Default Description
query str required 実行する SQL クエリ文字列
format str "CSV" 結果の出力フォーマット。対応フォーマット:
"CSV" - カンマ区切り値 (文字列)
"JSON" - JSON フォーマット (文字列)
"Arrow" - Apache Arrow フォーマット (bytes)
"Dataframe" - Pandas DataFrame (pandas が必要)
"Arrowtable" - PyArrow Table (pyarrow が必要)

戻り値

Return Type Description
str 文字列フォーマット (CSV、JSON) の場合
bytes Arrow フォーマットの場合
pandas.DataFrame dataframe フォーマットの場合
pyarrow.Table arrowtable フォーマットの場合

送出される例外

Exception Condition
RuntimeError クエリの実行に失敗した場合
ImportError 指定したフォーマットに必要なパッケージがインストールされていない場合

>>> conn = connect(":memory:")
>>>
>>> # 基本的なCSVクエリ
>>> result = conn.query("SELECT 1 as num, 'hello' as text")
>>> print(result)
num,text
1,hello
>>> # DataFrameフォーマット
>>> df = conn.query("SELECT number FROM numbers(5)", "dataframe")
>>> print(df)
   number
0       0
1       1
2       2
3       3
4       4

関連項目

  • send_query() - クエリをストリーミング実行する場合

send_query

SQLクエリを実行し、ストリーミング結果イテレータを返します。

このメソッドは SQLクエリを実行し、StreamingResult オブジェクトを返します。 これにより、結果全体を一度にメモリへ読み込むことなく、 結果を順に処理できます。大規模な結果セットの処理に最適です。

構文

send_query(query: str, format: str = 'CSV') → StreamingResult

パラメータ

パラメータ デフォルト 説明
query str required 実行する SQL クエリ文字列
format str "CSV" 結果の出力フォーマット。対応フォーマット:
"CSV" - カンマ区切り値
"JSON" - JSON フォーマット
"Arrow" - Apache Arrow フォーマット (record_batch() メソッドを有効化)
"dataframe" - Pandas DataFrame の chunk
"arrowtable" - PyArrow Table の chunk

戻り値

戻り値の型 説明
StreamingResult 次をサポートする、クエリ結果用のストリーミングイテレータ:
• イテレータプロトコル (for ループ)
• コンテキストマネージャプロトコル (with 文)
fetch() メソッドによる手動フェッチ
• PyArrow RecordBatch のストリーミング (Arrow フォーマットのみ)

送出される例外

例外 条件
RuntimeError クエリの実行に失敗した場合
ImportError フォーマットに必要なパッケージがインストールされていない場合

>>> conn = connect(":memory:")
>>>
>>> # 基本的なストリーミング
>>> stream = conn.send_query("SELECT number FROM numbers(1000)")
>>> for chunk in stream:
...     print(f"チャンク処理中: {len(chunk)} バイト")
>>> # コンテキストマネージャーを使用してクリーンアップ
>>> with conn.send_query("SELECT * FROM large_table") as stream:
...     chunk = stream.fetch()
...     while chunk:
...         process_data(chunk)
...         chunk = stream.fetch()
>>> # ArrowフォーマットとRecordBatchストリーミング
>>> stream = conn.send_query("SELECT * FROM data", "Arrow")
>>> reader = stream.record_batch(rows_per_batch=10000)
>>> for batch in reader:
...     print(f"Batch shape: {batch.num_rows} x {batch.num_columns}")

関連項目

  • query() - 非ストリーミングのクエリ実行用
  • StreamingResult - ストリーミング結果のイテレータ

class chdb.state.sqlitelike.StreamingResult

基底クラス: object

大規模なクエリ結果を処理するためのストリーミング結果イテレータです。

このクラスは、結果セット全体をメモリに読み込むことなくクエリ結果をストリーミングできるイテレータインターフェイスを提供します。さまざまな出力フォーマットをサポートしており、結果を手動で取得するためのメソッドや、PyArrow RecordBatch のストリーミングも提供します。

class chdb.state.sqlitelike.StreamingResult

fetch

ストリーミング結果の次の chunk を取得します。

このメソッドは、ストリーミング クエリの結果から次に利用可能なデータ chunk を取得します。返されるデータのフォーマットは、ストリーミング クエリの開始時に指定したフォーマットによって決まります。

構文

fetch() → Any

戻り値

戻り値の型 説明
str テキスト形式 (CSV、JSON) の場合
bytes バイナリ形式 (Arrow、Parquet) の場合
None 結果ストリームが終了した場合

>>> stream = conn.send_query("SELECT * FROM large_table")
>>> chunk = stream.fetch()
>>> while chunk is not None:
...     process_data(chunk)
...     chunk = stream.fetch()

cancel

ストリーミングクエリをキャンセルし、リソースをクリーンアップします。

このメソッドは、進行中のストリーミングクエリをキャンセルし、関連する リソースを解放します。ストリームが終了する前に結果の処理を停止したい 場合に呼び出してください。

構文

cancel() → None

>>> stream = conn.send_query("SELECT * FROM very_large_table")
>>> for i, chunk in enumerate(stream):
...     if i >= 10:  # 最初の10chunkのみ処理する
...         stream.cancel()
...         break
...     process_data(chunk)

close

ストリーミング結果を閉じ、リソースをクリーンアップします。

cancel() のエイリアスです。ストリーミング結果イテレーターを閉じ、 関連するリソースを解放します。

構文

close() → None

record_batch

効率的なバッチ処理のための PyArrow RecordBatchReader を作成します。

このメソッドは、Arrowフォーマットのクエリ結果を効率的に反復処理できる PyArrow RecordBatchReader を作成します。PyArrow を使用する場合、 大規模な結果セットを処理する最も効率的な方法です。

Syntax

record_batch(rows_per_batch: int = 1000000) → pa.RecordBatchReader

パラメータ

パラメータ デフォルト 説明
rows_per_batch int 1000000 バッチあたりの行数

戻り値

戻り値の型 説明
pa.RecordBatchReader バッチを順に処理するための PyArrow RecordBatchReader

>>> stream = conn.send_query("SELECT * FROM data", format="Arrow")
>>> reader = stream.record_batch(rows_per_batch=10000)
>>> for batch in reader:
...     print(f"Processing batch: {batch.num_rows} rows")
...     df = batch.to_pandas()
...     process_dataframe(df)

イテレータープロトコル

StreamingResult は Python のイテレータープロトコルに対応しているため、 for ループで直接使用できます。

>>> stream = conn.send_query("SELECT number FROM numbers(1000000)")
>>> for chunk in stream:
...     print(f"Chunk size: {len(chunk)} bytes")

コンテキストマネージャープロトコル

StreamingResult は、リソースを自動的に解放するための コンテキストマネージャープロトコルに対応しています:

>>> with conn.send_query("SELECT * FROM data") as stream:
...     for chunk in stream:
...         process(chunk)
>>> # ストリームは自動的にクローズされます

クラス chdb.state.sqlitelike.Cursor

基底: object

class chdb.state.sqlitelike.Cursor(connection)

close

カーソルを閉じて、リソースを解放します。

このメソッドはカーソルを閉じ、関連するリソースをすべて解放します。 このメソッドを呼び出すと、カーソルは無効になり、以降の操作では 使用できなくなります。

構文

close() → None

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT 1")
>>> result = cursor.fetchone()
>>> cursor.close()  # カーソルリソースのクリーンアップ

column_names

最後に実行されたクエリのカラム名の一覧を返します。

このメソッドは、直近に実行された SELECT クエリのカラム名を返します。カラム名は、 結果セットに表示される順序のまま返されます。

構文

column_names() → list

戻り値

戻り値の型 説明
list カラム名の文字列のリスト。クエリがまだ実行されていない場合、またはクエリがカラムを返さなかった場合は空のリスト

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT id, name, email FROM users LIMIT 1")
>>> print(cursor.column_names())
['id', 'name', 'email']

関連項目


column_types

最後に実行されたクエリのカラム型の一覧を返します。

このメソッドは、直近に実行された SELECT クエリの ClickHouse のカラムの型名を返します。型名は、結果セットに現れる順序と同じ順序で返されます。

構文

column_types() → list

戻り値

戻り値の型 説明
list ClickHouseの型名文字列のリスト。クエリが実行されていない場合、またはクエリの実行結果にカラムが含まれない場合は空のリスト

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT toInt32(1), toString('hello')")
>>> print(cursor.column_types())
['Int32', 'String']

関連項目


commit

未処理のトランザクションをコミットします。

このメソッドは、未処理のデータベーストランザクションをコミットします。ClickHouse では、ほとんどの操作が自動的にコミットされますが、DB-API 2.0 との互換性のために このメソッドが用意されています。

構文

commit() → None

使用例

>>> cursor = conn.cursor()
>>> cursor.execute("INSERT INTO test VALUES (1, 'data')")
>>> cursor.commit()

property description : list

DB-API 2.0 仕様に従ったカラム定義を返します。

このプロパティは、最後に実行された SELECT クエリの結果セット内の各カラムを説明する 7 項目のタプルのリストを返します。各タプルには次が含まれます: (name, type_code, display_size, internal_size, precision, scale, null_ok)

現在提供されるのは name と type_code のみで、その他のフィールドは None に設定されます。

Returns

Return Type Description
list 各カラムを説明する 7 要素タプルのリスト。SELECT クエリが一度も実行されていない場合は空のリスト

Examples

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT id, name FROM users LIMIT 1")
>>> for desc in cursor.description:
...     print(f"Column: {desc[0]}, Type: {desc[1]}")
Column: id, Type: Int32
Column: name, Type: String

関連項目


execute

SQLクエリを実行し、結果を取得できる状態にします。

このメソッドはSQLクエリを実行し、fetch メソッドを使って結果を取得できるように準備します。結果データのパースと、ClickHouseのデータ型に対する自動的な型変換を行います。

構文

execute(query: str) → None

パラメータ:

パラメータ 説明
query str 実行するSQLクエリ

送出される例外

例外 条件
Exception クエリの実行に失敗した場合、または結果のパースに失敗した場合

>>> cursor = conn.cursor()
>>>
>>> # DDLを実行
>>> cursor.execute("CREATE TABLE test (id INT, name String) ENGINE = Memory")
>>>
>>> # DMLを実行
>>> cursor.execute("INSERT INTO test VALUES (1, 'Alice')")
>>>
>>> # SELECTを実行して結果を取得
>>> cursor.execute("SELECT * FROM test")
>>> rows = cursor.fetchall()
>>> print(rows)
((1, 'Alice'),)

関連項目


fetchall

クエリ結果から残りの行をすべて取得します。

このメソッドは、現在のカーソル位置から、現在のクエリ結果セットに 残っているすべての行を取得します。戻り値は、適切な Python の型変換が 適用された行タプルのタプルです。

構文

fetchall() → tuple

戻り値:

戻り値の型 説明
tuple 結果セットに残っているすべての行タプルを含む Tuple。利用可能な行がない場合は空の tuple を返します

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT id, name FROM users")
>>> all_users = cursor.fetchall()
>>> for user_id, user_name in all_users:
...     print(f"User {user_id}: {user_name}")

関連項目


fetchmany

クエリ結果から複数の行を取得します。

このメソッドは、現在のクエリ結果セットから最大 size 行を取得します。各行には、適切に Python 型へ変換されたカラム値が含まれ、行タプルのタプルとして返されます。

構文

fetchmany(size: int = 1) → tuple

パラメータ

Parameter Type Default Description
size int 1 取得する行の最大数

戻り値

Return Type Description
tuple 最大 'size' 個の行タプルを含む Tuple。結果セットが尽きている場合は、これより少ない行数になることがあります

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT * FROM large_table")
>>>
>>> # 結果をバッチで処理する
>>> while True:
...     batch = cursor.fetchmany(100)  # 一度に100行取得する
...     if not batch:
...         break
...     process_batch(batch)

関連項目


fetchone

クエリ結果から次の行を取得します。

このメソッドは、現在のクエリの 結果セットから次に取得可能な行を返します。返り値は、 適切な Python の型変換が適用されたカラム値を含むタプルです。

構文

fetchone() → tuple | None

戻り値:

戻り値の型 説明
Optional[tuple] 次の行をカラム値のタプルとして返します。取得可能な行がもうない場合は None を返します

>>> cursor = conn.cursor()
>>> cursor.execute("SELECT id, name FROM users")
>>> row = cursor.fetchone()
>>> while row is not None:
...     user_id, user_name = row
...     print(f"User {user_id}: {user_name}")
...     row = cursor.fetchone()

関連項目


chdb.state.sqlitelike

クエリ結果を PyArrow Table に変換します。

この関数は、chdb のクエリ結果を PyArrow Table 形式に変換し、 効率的な列指向データアクセスと、 他のデータ処理ライブラリとの相互運用性を可能にします。

構文

chdb.state.sqlitelike.to_arrowTable(res)

パラメータ:

パラメータ 説明
res - chdb のクエリ結果オブジェクト。Arrowフォーマットのデータを含みます

戻り値

戻り値の型 説明
pyarrow.Table クエリ結果を含む PyArrow Table

発生する例外

例外 条件
ImportError pyarrow または pandas パッケージがインストールされていない場合

>>> import chdb
>>> result = chdb.query("SELECT 1 as num, 'hello' as text", "Arrow")
>>> table = to_arrowTable(result)
>>> print(table.schema)
num: int64
text: string
>>> print(table.to_pandas())
   num   text
0    1  hello

chdb.state.sqlitelike.to_df

クエリ結果を Pandas DataFrame に変換します。

この関数は、chdb のクエリ結果をまず PyArrow Table に変換し、次に DataFrame に変換します。これにより、Pandas API を使って手軽にデータ分析を行えます。

構文

chdb.state.sqlitelike.to_df(r)

パラメータ:

Parameter Type Description
r - Arrowフォーマットのデータを含む、chdbのクエリ結果オブジェクト

戻り値:

Return Type Description
pandas.DataFrame 適切なカラム名とデータ型を持つクエリ結果を格納したDataFrame

送出される例外

Exception Condition
ImportError pyarrow または pandas パッケージがインストールされていない場合

関連項目

>>> import chdb
>>> result = chdb.query("SELECT 1 as num, 'hello' as text", "Arrow")
>>> df = to_df(result)
>>> print(df)
   num   text
0    1  hello
>>> print(df.dtypes)
num      int64
text    object
dtype: object

DataFrame連携

class chdb.dataframe.Table

基底:

class chdb.dataframe.Table(*args: Any, **kwargs: Any)

Database API (DBAPI) 2.0 インターフェイス

chDB は、データベース接続用の Python DB-API 2.0 互換インターフェイスを提供しており、標準的なデータベースインターフェイスを前提とするツールやフレームワークで chDB を利用できます。

chDB の DB-API 2.0 インターフェイスには、次の要素が含まれます。

  • Connections: 接続文字列を使用したデータベース接続の管理
  • Cursors: クエリの実行と結果の取得
  • Type System: DB-API 2.0 準拠の型定数とコンバータ
  • Error Handling: 標準のデータベース例外階層
  • Thread Safety: レベル 1 のスレッドセーフティ (スレッドはモジュールを共有できますが、接続は共有できません)

主要な関数

Database API (DBAPI) 2.0 インターフェイスでは、以下の主要な関数を実装しています。

chdb.dbapi.connect

新しいデータベース接続を確立します。

構文

chdb.dbapi.connect(*args, **kwargs)

パラメータ

Parameter Type Default Description
path str None データベースファイルのパス。一時的な非永続データベースの場合は None

送出される例外

Exception Condition
err.Error connection を確立できない場合

chdb.dbapi.get_client_info()

クライアントのバージョン情報を取得します。

MySQLdb との互換性のため、chDB クライアントのバージョンを文字列として返します。

構文

chdb.dbapi.get_client_info()

戻り値

戻り値の型 説明
str 'major.minor.patch'形式のバージョン文字列

型コンストラクタ

chdb.dbapi.Binary(x)

x をバイナリ型として返します。

この関数は、DB-API 2.0 仕様に従い、バイナリのデータベースフィールドで使用できるよう、入力を bytes 型に変換します。

構文

chdb.dbapi.Binary(x)

パラメータ

パラメータ 説明
x - バイナリに変換する入力データ

戻り値

戻り値の型 説明
bytes 入力をバイト列に変換したもの

Connection クラス

class chdb.dbapi.connections.Connection(path=None)

基底クラス: object

chDB データベースへの DB-API 2.0 準拠の接続。

このクラスは、chDB データベースに接続して操作するための標準的な DB-API インターフェイスを提供します。一時データベースとファイルベースのデータベースの両方をサポートしています。

この接続は基盤となる chDB エンジンを管理し、 クエリの実行、トランザクションの管理 (ClickHouse では no-op) 、およびカーソルの作成のためのメソッドを提供します。

class chdb.dbapi.connections.Connection(path=None)

パラメーター

パラメーター デフォルト 説明
path str None データベースファイルのパス。None (デフォルト) の場合は、一時的な非永続データベース (':memory:' と同等) を使用します。ディスクに永続化するには、'database.db' のようなファイルパスを指定します。

変数

変数 説明
encoding str クエリの文字エンコーディング。デフォルトは 'utf8' です
open bool 接続が開いている場合は True、閉じている場合は False

>>> # Temporary database
>>> conn = Connection()
>>> cursor = conn.cursor()
>>> cursor.execute("SELECT 1")
>>> result = cursor.fetchall()
>>> conn.close()
>>> # File-based database
>>> conn = Connection('mydata.db')
>>> with conn.cursor() as cur:
...     cur.execute("CREATE TABLE users (id INT, name STRING) ENGINE = MergeTree() order by id")
...     cur.execute("INSERT INTO users VALUES (1, 'Alice')")
>>> conn.close()
>>> # Context manager usage
>>> with Connection() as cur:
...     cur.execute("SELECT version()")
...     version = cur.fetchone()

close

データベース接続を閉じます。

基盤となる chDB 接続を閉じ、この接続を閉じた状態としてマークします。 この接続に対する以降の操作では、Error が発生します。

構文

close()

発生する例外

Exception 条件
err.Error 接続がすでに閉じられている場合

commit

現在のトランザクションを確定します。

構文

commit()

cursor

クエリ実行用の新しいカーソルを作成します。

構文

cursor(cursor=None)

パラメータ

パラメータ 説明
cursor - 無視されます。互換性のために用意されています

戻り値

戻り値の型 説明
Cursor この接続に対する新しいカーソルオブジェクト

発生する例外

例外 条件
err.Error 接続が閉じられている場合

>>> conn = Connection()
>>> cur = conn.cursor()
>>> cur.execute("SELECT 1")
>>> result = cur.fetchone()

escape

SQLクエリに安全に含めるために、値をエスケープします。

構文

escape(obj, mapping=None)

パラメータ

パラメータ 説明
obj - エスケープする値 (文字列、bytes、数値など)
mapping - エスケープ時に使用する省略可能な文字マッピング

戻り値

戻り値の型 説明
- SQLクエリで使用できるようにエスケープした入力値

>>> conn = Connection()
>>> safe_value = conn.escape("O'Reilly")
>>> query = f"SELECT * FROM users WHERE name = {safe_value}"

escape_string

SQLクエリ向けに文字列値をエスケープします。

構文

escape_string(s)

パラメータ

パラメータ 説明
s str エスケープする文字列

戻り値

戻り値の型 説明
str SQL に含めても安全な、エスケープ済みの文字列

property open

接続が開いているかどうかを確認します。

戻り値

戻り値の型 説明
bool 接続が開いていれば True、閉じていれば False

query

SQLクエリを直接実行し、生の結果を返します。

このメソッドは cursor インターフェイスを介さず、クエリを直接実行します。 標準的な DB-API の使い方では、cursor() メソッドの使用を推奨します。

構文

query(sql, fmt='CSV')

パラメータ:

パラメータ デフォルト 説明
sql str or bytes required 実行するSQLクエリ
fmt str "CSV" 出力フォーマット。対応フォーマットには "CSV"、"JSON"、"Arrow"、"Parquet" などがあります。

戻り値

戻り値の型 説明
- 指定したフォーマットのクエリ結果

発生する例外

例外 条件
err.InterfaceError 接続が閉じている場合、またはクエリが失敗した場合

>>> conn = Connection()
>>> result = conn.query("SELECT 1, 'hello'", "CSV")
>>> print(result)
"1,hello\n"

property resp

直前のクエリのレスポンスを取得します。

戻り値

Return Type Description
- 直前の query() 呼び出しの生のレスポンス

rollback

現在のトランザクションをロールバックします。

構文

rollback()

Cursor クラス

class chdb.dbapi.cursors.Cursor

基底: object

クエリの実行と結果の取得を行うための DB-API 2.0 カーソルです。

このカーソルは、SQL ステートメントの実行、クエリ結果の管理、 および結果セット内の移動に使用するメソッドを提供します。パラメータのバインドや一括操作をサポートし、 DB-API 2.0 の仕様に準拠しています。

Cursor インスタンスを直接作成しないでください。代わりに Connection.cursor() を使用してください。

class chdb.dbapi.cursors.Cursor(connection)
Variable 説明
description tuple 直前のクエリ結果のカラムメタデータ
rowcount int 直前のクエリで影響を受けた行数 (不明な場合は -1)
arraysize int 1 回で取得するデフォルトの行数 (デフォルト: 1)
lastrowid - 最後に挿入された行の ID (該当する場合)
max_stmt_length int executemany() の最大ステートメントサイズ (デフォルト: 1024000)

>>> conn = Connection()
>>> cur = conn.cursor()
>>> cur.execute("SELECT 1 as id, 'test' as name")
>>> result = cur.fetchone()
>>> print(result)  # (1, 'test')
>>> cur.close()

callproc

ストアドプロシージャを実行します (暫定実装) 。

構文

callproc(procname, args=())

パラメータ

Parameter Type Description
procname str 実行するストアドプロシージャの名前
args sequence プロシージャに渡す引数

戻り値

Return Type Description
sequence 元の args パラメータ (未変更)

close

カーソルを閉じ、関連するリソースを解放します。

閉じるとカーソルは使用できなくなり、以降の操作では例外が発生します。 カーソルを閉じると、残りのデータはすべて読み尽くされ、内部のカーソルが解放されます。

構文

close()

execute

オプションでパラメータをバインドして、SQLクエリを実行します。

このメソッドは、オプションのパラメータ置換を使用して、単一のSQLステートメントを実行します。 柔軟に利用できるよう、複数のパラメータプレースホルダー形式をサポートしています。

構文

execute(query, args=None)

パラメータ

パラメータ デフォルト 説明
query str required 実行する SQL クエリ
args tuple/list/dict None プレースホルダーにバインドするパラメータ

戻り値

戻り値の型 説明
int 影響を受けた行数 (不明な場合は -1)

パラメータのスタイル

スタイル
クエスチョンマーク形式 "SELECT * FROM users WHERE id = ?"
名前付き形式 "SELECT * FROM users WHERE name = %(name)s"
フォーマット形式 "SELECT * FROM users WHERE age = %s" (レガシー)

>>> # クエスチョンマークパラメータ
>>> cur.execute("SELECT * FROM users WHERE id = ? AND age > ?", (123, 18))
>>>
>>> # 名前付きパラメータ
>>> cur.execute("SELECT * FROM users WHERE name = %(name)s", {'name': 'Alice'})
>>>
>>> # パラメータなし
>>> cur.execute("SELECT COUNT(*) FROM users")

発生する例外

例外 条件
ProgrammingError カーソルが閉じられているか、クエリの形式が不正な場合
InterfaceError 実行中にデータベースエラーが発生した場合

executemany(query, args)

異なるパラメータセットでクエリを複数回実行します。

このメソッドは、異なるパラメータ値を使って同じ SQL クエリを複数回効率よく実行します。特に、一括 INSERT に便利です。

構文

executemany(query, args)

パラメータ

パラメータ 説明
query str 複数回実行する SQL クエリ
args sequence 各実行で使用するパラメータのタプル/辞書/リストの数列

戻り値

戻り値の型 説明
int すべての実行で影響を受けた行の総数

>>> # クエスチョンマークパラメータを使用したバルクインサート
>>> users_data = [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]
>>> cur.executemany("INSERT INTO users VALUES (?, ?)", users_data)
>>>
>>> # 名前付きパラメータを使用したバルクインサート
>>> users_data = [
...     {'id': 1, 'name': 'Alice'},
...     {'id': 2, 'name': 'Bob'}
... ]
>>> cur.executemany(
...     "INSERT INTO users VALUES (%(id)s, %(name)s)",
...     users_data
... )

fetchall()

クエリ結果から残りのすべての行を取得します。

構文

fetchall()

戻り値

戻り値の型 説明
list 残っているすべての行を表すタプルのリスト

送出される例外

例外 条件
ProgrammingError execute() が先に呼び出されていない場合

>>> cursor.execute("SELECT id, name FROM users")
>>> all_rows = cursor.fetchall()
>>> print(len(all_rows))  # 総行数

fetchmany

クエリ結果から複数行を取得します。

構文

fetchmany(size=1)

パラメーター

パラメーター Type Default Description
size int 1 取得する行数。指定しない場合は cursor.arraysize が使用されます

戻り値

Return Type Description
list 取得された行を表すタプルのリスト

送出される例外

Exception Condition
ProgrammingError execute() が事前に呼び出されていない場合

>>> cursor.execute("SELECT id, name FROM users")
>>> rows = cursor.fetchmany(3)
>>> print(rows)  # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]

fetchone

クエリ結果から次の行を取得します。

構文

fetchone()

戻り値

戻り値の型 説明
tuple or None 次の行をタプルとして返します。利用可能な行がもうない場合は None

送出される例外

例外 条件
ProgrammingError execute() が先に呼び出されていない場合

>>> cursor.execute("SELECT id, name FROM users LIMIT 3")
>>> row = cursor.fetchone()
>>> print(row)  # (1, 'Alice')
>>> row = cursor.fetchone()
>>> print(row)  # (2, 'Bob')

max_stmt_length = 1024000

executemany() が生成するステートメントの最大サイズです。

デフォルト値は 1024000 です。


mogrify

データベースに送信される正確なクエリ文字列を返します。

このメソッドは、パラメータ置換後の最終的な SQL クエリを表示するため、 デバッグやログの確認に役立ちます。

構文

mogrify(query, args=None)

パラメータ

Parameter Type Default Description
query str required パラメータのプレースホルダーを含むSQLクエリ
args tuple/list/dict None 置換するパラメータ

戻り値

Return Type Description
str パラメータが置換された最終的なSQLクエリ文字列

>>> cur.mogrify("SELECT * FROM users WHERE id = ?", (123,))
"SELECT * FROM users WHERE id = 123"

nextset

次の結果セットに移動します (未サポート) 。

構文

nextset()

戻り値

Return Type Description
None 複数の結果セットはサポートされていないため、常に None を返します

setinputsizes

パラメーターの入力サイズを設定します (実際には何も行いません) 。

構文

setinputsizes(*args)

パラメータ

Parameter Type Description
*args - パラメータサイズの指定 (無視されます)

setoutputsizes

出力カラムのサイズを設定します (実際には何も行わない実装です) 。

構文

setoutputsizes(*args)

パラメータ

パラメータ 説明
*args - カラムサイズの指定 (無視されます)

エラークラス

chdb のデータベース操作に関する例外クラスです。

このモジュールは、Python Database API Specification v2.0 に準拠し、chdb におけるデータベース関連のエラーを処理するための例外クラス階層を一式提供します。

例外クラスの階層は次のとおりです。

StandardError
├── Warning
└── Error
    ├── InterfaceError
    └── DatabaseError
        ├── DataError
        ├── OperationalError
        ├── IntegrityError
        ├── InternalError
        ├── ProgrammingError
        └── NotSupportedError

各例外クラスは、データベースエラーの特定のカテゴリを表します。

Exception Description
Warning データベース操作中の致命的でない警告
InterfaceError データベースインターフェイス自体に関する問題
DatabaseError すべてのデータベース関連エラーの基底クラス
DataError データ処理に関する問題 (無効な値、型エラー)
OperationalError データベース運用上の問題 (接続、リソース)
IntegrityError 制約違反 (外部キー、一意制約)
InternalError データベース内部エラーおよび破損
ProgrammingError SQL構文エラーおよびAPIの誤用
NotSupportedError サポートされていない機能または操作

関連項目

>>> try:
...     cursor.execute("SELECT * FROM nonexistent_table")
... except ProgrammingError as e:
...     print(f"SQL Error: {e}")
...
SQL Error: Table 'nonexistent_table' doesn't exist
>>> try:
...     cursor.execute("INSERT INTO users (id) VALUES (1), (1)")
... except IntegrityError as e:
...     print(f"Constraint violation: {e}")
...
Constraint violation: Duplicate entry '1' for key 'PRIMARY'

exception chdb.dbapi.err.DataError

基底クラス: DatabaseError

処理対象のデータに問題があることが原因で発生するエラーに対して送出される例外です。

この例外は、処理中のデータに問題があり、データベース操作が失敗した場合に送出されます。たとえば、次のような場合です。

  • ゼロ除算
  • 範囲外の数値
  • 無効な日付/時刻の値
  • 文字列の切り捨てエラー
  • 型変換の失敗
  • カラム型に対して無効なデータフォーマット

送出される例外

Exception Condition
DataError データの検証または処理に失敗した場合

>>> # SQLでゼロ除算
>>> cursor.execute("SELECT 1/0")
DataError: Division by zero
>>> # 無効な日付フォーマット
>>> cursor.execute("INSERT INTO table VALUES ('invalid-date')")
DataError: Invalid date format

例外 chdb.dbapi.err.DatabaseError

基底: Error

データベースに関連するエラーに対して送出される例外です。

これは、データベース関連のすべてのエラーの基底クラスです。 データベース操作中に発生し、インターフェイス自体ではなく データベースそのものに起因するすべてのエラーを含みます。

一般的なケースには、次のようなものがあります。

  • SQL 実行エラー
  • データベース接続の問題
  • トランザクション関連の問題
  • データベース固有の制約違反

例外 chdb.dbapi.err.Error

基底: StandardError

警告 (Warning) を除く、他のすべてのエラー例外の基底クラスとなる例外です。

これは、警告を除く chdb のすべてのエラー例外の基底クラスです。 操作を正常に完了できない原因となる、あらゆるデータベースエラー状態の親クラスとして機能します。

関連項目

  • Warning - 操作の完了を妨げない非致命的な警告

例外 chdb.dbapi.err.IntegrityError

基底クラス: DatabaseError

データベースの関係整合性が損なわれた場合に送出される例外です。

この例外は、データベース操作が整合性制約に違反した場合に送出されます。 これには、次のようなケースが含まれます。

  • 外部キー制約違反
  • 主キーまたは UNIQUE 制約違反 (重複キー)
  • CHECK 制約違反
  • NOT NULL 制約違反
  • 参照整合性違反

送出

例外 条件
IntegrityError データベースの整合性制約に違反した場合

>>> # 主キーの重複
>>> cursor.execute("INSERT INTO users (id, name) VALUES (1, 'John')")
>>> cursor.execute("INSERT INTO users (id, name) VALUES (1, 'Jane')")
IntegrityError: Duplicate entry '1' for key 'PRIMARY'
>>> # 外部キー違反
>>> cursor.execute("INSERT INTO orders (user_id) VALUES (999)")
IntegrityError: Cannot add or update a child row: foreign key constraint fails

例外 chdb.dbapi.err.InterfaceError

基底クラス: Error

データベース自体ではなく、データベースのインターフェイスに関連するエラーに対して送出される例外です。

この例外は、データベースのインターフェイス実装に次のような問題がある場合に送出されます。

  • 無効な接続パラメーター
  • API の誤用 (クローズされた接続に対してメソッドを呼び出すなど)
  • インターフェイスレベルのプロトコルエラー
  • モジュールのインポートまたは初期化の失敗

発生する例外

Exception 条件
InterfaceError データベースの操作とは無関係なエラーがデータベースインターフェイスで発生した場合

例外 chdb.dbapi.err.InternalError

基底クラス: DatabaseError

データベースで内部エラーが発生したときに送出される例外です。

この例外は、アプリケーションが原因ではない内部エラーがデータベースシステムで 発生した場合に送出されます。たとえば、次のようなものです。

  • 無効なカーソル状態 (カーソルがすでに有効でない)
  • トランザクション状態の不整合 (トランザクションの同期が取れていない)
  • データベースの破損
  • 内部データ構造の破損
  • システムレベルのデータベースエラー

送出

Exception Condition
InternalError データベースで内部的な不整合が発生した場合

例外 chdb.dbapi.err.NotSupportedError

基底クラス: DatabaseError

メソッドまたはデータベース API がサポートされていない場合に発生する例外です。

この例外は、アプリケーションが現在のデータベース構成またはバージョンでサポートされていないデータベース機能や API メソッドを使用しようとしたときに発生します。たとえば、次のような場合です。

  • トランザクションをサポートしていない接続で rollback() を要求する
  • データベースのバージョンでサポートされていない高度な SQL 機能を使用する
  • 現在のドライバーで実装されていないメソッドを呼び出す
  • 無効化されているデータベース機能を使用しようとする

送出される例外

例外 条件
NotSupportedError サポートされていないデータベース機能にアクセスした場合

>>> # トランザクションをサポートしない接続でのトランザクションロールバック
>>> connection.rollback()
NotSupportedError: Transactions are not supported
>>> # サポートされていないSQL構文の使用
>>> cursor.execute("SELECT * FROM table WITH (NOLOCK)")
NotSupportedError: WITH clause not supported in this database version

例外 chdb.dbapi.err.OperationalError

基底: DatabaseError

データベースの操作に関連するエラーに対して送出される例外です。

この例外は、データベースの操作中に発生し、 必ずしもプログラマーの制御下にあるとは限らないエラーに対して送出されます。これには、次のようなものが含まれます。

  • データベースからの予期しない切断
  • データベースサーバーが見つからない、または到達できない
  • トランザクション処理の失敗
  • 処理中のメモリ割り当てエラー
  • ディスク容量またはリソースの枯渇
  • データベースサーバーの内部エラー
  • 認証または認可の失敗

送出

例外 条件
OperationalError 運用上の問題によりデータベース操作が失敗した場合

例外 chdb.dbapi.err.ProgrammingError

基底クラス: DatabaseError

データベース操作におけるプログラミングエラーに対して送出される例外です。

この例外は、アプリケーションによるデータベースの使用に プログラミングエラーがある場合に送出されます。これには、次のようなものが含まれます。

  • テーブルまたはカラムが見つからない
  • 作成時にテーブルまたは索引がすでに存在する
  • ステートメント内の SQL 構文エラー
  • プリペアドステートメントで指定されたパラメータ数が誤っている
  • 無効な SQL 操作 (例: 存在しないオブジェクトに対する DROP)
  • データベース API メソッドの誤った使用

送出

例外 条件
ProgrammingError SQL ステートメントまたは API の使用にエラーがある場合

>>> # テーブルが見つからない
>>> cursor.execute("SELECT * FROM nonexistent_table")
ProgrammingError: Table 'nonexistent_table' doesn't exist
>>> # SQL構文エラー
>>> cursor.execute("SELCT * FROM users")
ProgrammingError: You have an error in your SQL syntax
>>> # パラメータ数が間違っている
>>> cursor.execute("INSERT INTO users (name, age) VALUES (%s)", ('John',))
ProgrammingError: Column count doesn't match value count

例外 chdb.dbapi.err.StandardError

基底クラス: Exception

chdb を使用した操作に関連する例外です。

このクラスは、chdb 関連のすべての例外の基底クラスです。Python の組み込み Exception クラスを継承しており、データベース操作における例外階層のルートとなります。


例外 chdb.dbapi.err.Warning

基底クラス: StandardError

挿入時のデータ切り捨てなど、重要な警告に対して送出される例外です。

この例外は、database 操作自体は完了したものの、 アプリケーション側で注意すべき重要な警告がある場合に送出されます。 一般的な例としては、次のようなものがあります。

  • 挿入時のデータ切り捨て
  • 数値変換時の精度低下
  • 文字セット変換に関する警告

モジュール定数

chdb.dbapi.apilevel = '2.0'

str(object=’’) -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

指定されたオブジェクトから新しい文字列オブジェクトを作成します。encoding または errors が指定されている場合、そのオブジェクトは、指定された encoding と エラーハンドラーを使ってデコードされるデータバッファを公開している必要が あります。そうでない場合は、object._\_str_\_() の結果 (定義されている場合) または repr(object) を返します。

  • encoding のデフォルトは ‘utf-8’ です。
  • errors のデフォルトは ‘strict’ です。

chdb.dbapi.threadsafety = 1

int([x]) -> integer
int(x, base=10) -> integer

数値または文字列を整数に変換します。引数が指定されていない場合は 0 を返します。 x が数値の場合は、x._int_() を返します。浮動小数点 数の場合は、0 に向かって切り捨てられます。

x が数値でない場合、または base が指定されている場合は、x は 指定された基数の整数リテラルを表す string、bytes、または bytearray インスタンスでなければなりません。リテラルの前に ‘+’ または ‘-’ を付けることができ、 前後に空白を含めることもできます。base の既定値は 10 です。有効な基数は 0 および 2-36 です。base 0 は、文字列から基数を整数リテラルとして解釈することを意味します。

>>> int(‘0b100’, base=0)
4

chdb.dbapi.paramstyle = 'format'

str(object=’’) -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

与えられたオブジェクトから新しい文字列オブジェクトを作成します。encoding または errors が指定されている場合、オブジェクトは、指定された encoding とエラーハンドラーで デコードされるデータバッファを公開している必要があります。 それ以外の場合は、object._str_() の結果 (定義されている場合) または repr(object) を返します。 encoding のデフォルトは ‘utf-8’ です。 errors のデフォルトは ‘strict’ です。


型定数

chdb.dbapi.STRING = frozenset({247, 253, 254})

DB-API 2.0 の型比較用に拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較のセマンティクスをサポートするために、frozenset を拡張したものです。 これにより、個々の項目を等値演算子と不等値演算子の両方で Set と比較できるため、 柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合に、field_type == STRING のような比較を行えるようにします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.BINARY = frozenset({249, 250, 251, 252})

DB-API 2.0 の型比較向けに拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較セマンティクスをサポートするために、frozenset を拡張したものです。 これにより、等価演算子と不等価演算子の両方を使って、個々の項目を Set に対して比較できる柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合でも、“field_type == STRING” のような 比較を行えるようにします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.NUMBER = frozenset({0, 1, 3, 4, 5, 8, 9, 13})

DB-API 2.0 の型比較のために拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較のセマンティクスをサポートするように frozenset を拡張したものです。 これにより、個々の項目を等価演算子と不等価演算子の両方で Set と比較できる、柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合に “field_type == STRING” のような 比較を行えるようにします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.DATE = frozenset({10, 14})

DB-API 2.0 の型比較向けに拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較のセマンティクスをサポートするために frozenset を拡張したものです。 これにより、個々の項目を等価演算子と不等価演算子の両方で Set と比較できる、柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使われ、 field_type が単一の型の値である場合に、“field_type == STRING” のような 比較を行えるようにします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.TIME = frozenset({11})

DB-API 2.0 の型比較用に拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較のセマンティクスをサポートするために、 frozenset を拡張したものです。 これにより、個々の項目を等価演算子と不等価演算子の両方で Set と比較できる、 柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合に、「field_type == STRING」のような 比較を可能にします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.TIMESTAMP = frozenset({7, 12})

DB-API 2.0 の型比較用に拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較のセマンティクスをサポートするために、frozenset を拡張したものです。 これにより、個々の項目を等価演算子と不等価演算子の両方を使って Set と比較できる、 柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合に、「field_type == STRING」のような比較を可能にします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # True を返す
>>> FIELD_TYPE.INT != string_types     # True を返す
>>> FIELD_TYPE.BLOB in string_types    # False を返す

chdb.dbapi.DATETIME = frozenset({7, 12})

DB-API 2.0 の型比較のために拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較セマンティクスに対応するために frozenset を拡張したものです。 これにより、個々の項目を等値演算子と不等値演算子の両方で Set と比較できる柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使われ、 field_type が単一の型の値である場合に “field_type == STRING” のような 比較を行えるようにします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # Trueを返す
>>> FIELD_TYPE.INT != string_types     # Trueを返す
>>> FIELD_TYPE.BLOB in string_types    # Falseを返す

chdb.dbapi.ROWID = frozenset({})

DB-API 2.0 の型比較用に拡張された frozenset です。

このクラスは、DB-API 2.0 の型比較セマンティクスをサポートするために、frozenset を拡張したものです。 個々の項目を等値演算子と不等値演算子の両方で Set と比較できるため、 柔軟な型チェックが可能になります。

これは STRING、BINARY、NUMBER などの型定数で使用され、 field_type が単一の型の値である場合に、「field_type == STRING」のような 比較を可能にします。

>>> string_types = DBAPISet([FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING])
>>> FIELD_TYPE.STRING == string_types  # Returns True
>>> FIELD_TYPE.INT != string_types     # Returns True
>>> FIELD_TYPE.BLOB in string_types    # Returns False

使用例

基本的なクエリの例:

import chdb.dbapi as dbapi

print("chdb driver version: {0}".format(dbapi.get_client_info()))

# Create connection and cursor
conn = dbapi.connect()
cur = conn.cursor()

# Execute query
cur.execute('SELECT version()')
print("description:", cur.description)
print("data:", cur.fetchone())

# Clean up
cur.close()
conn.close()

データの扱い:

import chdb.dbapi as dbapi

conn = dbapi.connect()
cur = conn.cursor()

# Create table
cur.execute("""
    CREATE TABLE employees (
        id UInt32,
        name String,
        department String,
        salary Decimal(10,2)
    ) ENGINE = Memory
""")

# Insert data
cur.execute("""
    INSERT INTO employees VALUES
    (1, 'Alice', 'Engineering', 75000.00),
    (2, 'Bob', 'Marketing', 65000.00),
    (3, 'Charlie', 'Engineering', 80000.00)
""")

# Query data
cur.execute("SELECT * FROM employees WHERE department = 'Engineering'")

# Fetch results
print("Column names:", [desc[0] for desc in cur.description])
for row in cur.fetchall():
    print(row)

conn.close()

接続管理:

import chdb.dbapi as dbapi

# Temporary database (default)
conn1 = dbapi.connect()

# Persistent database file
conn2 = dbapi.connect("./my_database.chdb")

# Connection with parameters
conn3 = dbapi.connect("./my_database.chdb?log-level=debug&verbose")

# Read-only connection
conn4 = dbapi.connect("./my_database.chdb?mode=ro")

# Automatic connection cleanup
with dbapi.connect("test.chdb") as conn:
    cur = conn.cursor()
    cur.execute("SELECT count() FROM numbers(1000)")
    result = cur.fetchone()
    print(f"Count: {result[0]}")
    cur.close()

ベストプラクティス

  1. 接続管理: 使用後は必ず接続とカーソルを閉じる
  2. コンテキストマネージャー: 自動クリーンアップには with 文を使用する
  3. バッチ処理: 大量の結果セットには fetchmany() を使用する
  4. エラー処理: データベース操作は try-except ブロックで囲む
  5. パラメータバインディング: 可能な場合はパラメータ化されたクエリを使用する
  6. メモリ管理: 非常に大きなデータセットでは fetchall() を避ける

Python ユーザー定義関数 (UDF)

chDB は、型付きの引数、自動型推論、設定可能な NULL/例外処理を備え、インプロセスで実行されるネイティブ Python UDF をサポートしています。UDF として登録した Python 関数は、SQL クエリから直接呼び出せます。

以下の例では、デフォルトの CSV 出力フォーマットを使用します。インラインコメントは論理的な結果値を示しています。生データ出力では、NULL\N として出力され、文字列および日付の値には CSV の引用符付けが適用されます。

chdb.create_function

Python 関数を chDB SQL 関数として登録します。

構文

chdb.create_function(name, func, arg_types=None, return_type=None, *, on_null=None, on_error=None)

パラメータ

パラメータ デフォルト 説明
name str (必須) 登録するSQL関数の名前
func callable (必須) 登録するPython関数
arg_types list of ChdbType/str/type, or None None 引数の型のリスト。Noneの場合は、型アノテーションから推論されます
return_type ChdbType/str/type, or None None 戻り値の型。Noneの場合は関数の戻り値アノテーションから推論され、アノテーションもない場合は登録に失敗します
on_null str or NullHandling None (スキップ) NULL入力の処理方法:"skip"または"pass"。キーワード専用
on_error str or ExceptionHandling None (伝播) 例外の処理方法:"propagate"または"ignore"。キーワード専用

各型パラメータ (arg_typesの要素およびreturn_type) には、以下を指定できます。

  • ChdbType定数:INT64STRINGFLOAT64など
  • ClickHouse型文字列:"Int64""String""DateTime64(6)""DateTime('UTC')"など
  • Python型:intfloatstrboolbytesdatetime.datedatetime.datetime自動型マッピングに従ってマッピングされます

すでに登録済みの名前を登録しようとするとエラーが発生します。UDFsは暗黙的に置き換えられません。関数を再登録するには、まずdrop_functionを呼び出してください。

from chdb import create_function, drop_function, query
from chdb.sqltypes import INT64, STRING

create_function("strlen", len, arg_types=[STRING], return_type=INT64)
print(query("SELECT strlen('hello')"))  # 5

drop_function("strlen")

chdb.drop_function

登録済みの Python UDF を削除します。関数が登録されていない場合は何も実行されないため、常に安全に呼び出せます。

構文

chdb.drop_function(name)

パラメータ

パラメータ Type 説明
name str 削除する SQL 関数の名前

@func デコレータ

Python 関数を chDB SQL 関数として登録するデコレータです。登録した関数は通常の Python 関数として引き続き呼び出せるほか、__name__ を使用して SQL クエリからも利用できます。

構文

from chdb import func

@func(arg_types=None, return_type=None, *, on_null=None, on_error=None)
def my_function(...):
    ...

パラメータ

デコレートされた関数から導出される namefunc を除き、create_function と同じです。

from chdb import func, query
from chdb.sqltypes import INT64, STRING

# Explicit types
@func([INT64, INT64], INT64)
def add(a, b):
    return a + b

# Types inferred from annotations
@func()
def multiply(a: int, b: int) -> int:
    return a * b

# Explicit return_type, arg_types inferred from annotations
@func(return_type=STRING)
def greet(name: str):
    return f"Hello, {name}!"

print(query("SELECT add(12, 22)"))       # 34
print(query("SELECT multiply(3, 7)"))    # 21
print(query("SELECT greet('world')"))    # Hello, world!

型システム

利用可能な型

chdb.sqltypes から型をインポートします。

from chdb.sqltypes import (
    BOOL,
    INT8, INT16, INT32, INT64, INT128, INT256,
    UINT8, UINT16, UINT32, UINT64, UINT128, UINT256,
    FLOAT32, FLOAT64,
    STRING,
    DATE, DATE32, DATETIME, DATETIME64,
)

自動型マッピング

Python アノテーションから型を推論する場合、以下のマッピングが使用されます。

Python Type ClickHouse Type
bool Bool
int Int64
float Float64
str String
bytes String
bytearray String
datetime.date Date
datetime.datetime DateTime64(6)

型の指定方法

型は複数の方法で指定できます。

from chdb import create_function, func
from chdb.sqltypes import INT64

# 1. ChdbType constants
create_function("f1", lambda x: x, arg_types=[INT64], return_type=INT64)

# 2. ClickHouse type strings
create_function("f2", lambda x: x, arg_types=["Int64"], return_type="Int64")

# 3. Parameterized type strings
create_function("f3", lambda x: x, arg_types=["DateTime('UTC')"], return_type="DateTime('UTC')")

# 4. Python types — passed directly or used as annotations
create_function("f4", lambda x: x, arg_types=[int], return_type=int)

@func()
def f5(x: int) -> int:
    return x

NULL の処理

on_null パラメータで NULL 値の処理を制御します。

列挙型 動作
"skip" NullHandling.SKIP 関数を呼び出さずに NULL を返す (デフォルト)
"pass" NullHandling.PASS NULL を None に変換して関数を呼び出す
from chdb import func, query, NullHandling

# Default: NULL in → NULL out, function not called
@func(return_type="Int64")
def add_one(x: int) -> int:
    return x + 1

print(query("SELECT add_one(NULL)"))  # NULL

# Pass NULL as None
@func(return_type="Int64", on_null="pass")
def null_safe(x):
    return 0 if x is None else x + 1

print(query("SELECT null_safe(NULL)"))  # 0

例外処理

on_error パラメータを使用して、例外の処理方法を制御します。

列挙型 動作
"propagate" ExceptionHandling.PROPAGATE 例外を SQL エラーとして送出する (デフォルト)
"ignore" ExceptionHandling.IGNORE 例外を捕捉して NULL を返す
from chdb import func, query

# Default: exception propagates
@func(arg_types=["Int64", "Int64"], return_type="Int64")
def divide(a, b):
    return a // b

# print(query("SELECT divide(1, 0)"))  # Error: division by zero

# Ignore: exception → NULL
@func(arg_types=["Int64", "Int64"], return_type="Int64", on_error="ignore")
def safe_divide(a, b):
    return a // b

print(query("SELECT safe_divide(1, 0)"))   # NULL
print(query("SELECT safe_divide(10, 2)"))  # 5

DateTime とタイムゾーンのサポート

UDF は、タイムゾーンに対応した DateDate32DateTimeDateTime64 型を完全にサポートします。

from chdb import func, query
from datetime import datetime, timedelta, date

@func(arg_types=["DateTime('UTC')"], return_type="DateTime('UTC')")
def add_one_hour(dt):
    return dt + timedelta(hours=1)

@func()
def get_year(d: date) -> int:
    return d.year

print(query("SELECT add_one_hour(toDateTime('2024-01-01 12:00:00', 'UTC'))"))  # 2024-01-01 13:00:00
print(query("SELECT get_year(toDate('2024-06-15'))"))  # 2024
  • 入力されたClickHouseのDateTime/DateTime64値は、タイムゾーン情報を含むPythonのdatetimeオブジェクトに変換されます
  • 出力されるPythonのdatetimeオブジェクトは、ClickHouseに返される際もタイムゾーン情報を保持します
  • chdb.sqltypesDATETIME64型は、デフォルトでスケールが6 (マイクロ秒) に設定されており、DateTime64(6)と同等です

レガシー API

chdb.udf.chdb_udf

chDB の Python UDF (ユーザー定義関数) のデコレータ。

構文

chdb.udf.chdb_udf(return_type='String')

パラメータ

Parameter Type Default Description
return_type str "String" 関数の戻り値の型です。ClickHouse のデータ型のいずれかである必要があります

注意

  1. 関数はステートレスである必要があります。サポートされるのは UDF のみで、UDAF はサポートされません。
  2. デフォルトの戻り値の型は String です。戻り値の型は ClickHouse のデータ型のいずれかである必要があります。
  3. 関数は String 型の引数を受け取る必要があります。すべての引数は文字列です。
  4. 関数は入力の各行に対して呼び出されます。
  5. 関数は pure Python の関数である必要があります。関数内で使用するすべてのモジュールをインポートしてください。
  6. 使用される Python インタープリタは、スクリプトの実行に使用されるものと同じです。

@chdb_udf()
def sum_udf(lhs, rhs):
    return int(lhs) + int(rhs)

@chdb_udf()
def func_use_json(arg):
    import json
    # ... use json module

chdb.udf.generate_udf

UDF の設定ファイルと実行可能スクリプトファイルを生成します。

この関数は、chDB のユーザー定義関数 (UDF) に必要なファイルを作成します。

  1. 入力データを処理する Python の実行可能スクリプト
  2. UDF を ClickHouse に登録する XML 設定ファイル

構文

chdb.udf.generate_udf(func_name, args, return_type, udf_body)

パラメータ

パラメータ 説明
func_name str UDF関数の名前
args list 関数の引数名のリスト
return_type str 関数の ClickHouse の戻り値の型
udf_body str UDF関数の Python ソースコード本体

ユーティリティ

chDB 向けのユーティリティ関数とヘルパーです。

このモジュールには、データ型の推論、データ変換用ヘルパー、デバッグ用ユーティリティなど、chDB の利用に役立つさまざまなユーティリティ関数が含まれています。


chdb.utils.convert_to_columnar

辞書のリストを列指向フォーマットに変換します。

この関数は辞書のリストを受け取り、各キーがカラムに対応し、各値がそのカラムの値のリストである辞書に変換します。 辞書内に存在しない値は None として表されます。

構文

chdb.utils.convert_to_columnar(items: List[Dict[str, Any]]) → Dict[str, List[Any]]

パラメータ

パラメータ 説明
items List[Dict[str, Any]] 変換対象の辞書のリスト

戻り値

戻り値の型 説明
Dict[str, List[Any]] キーがカラム名、値が各カラムの値のリストである Dictionary

>>> items = [
...     {"name": "Alice", "age": 30, "city": "New York"},
...     {"name": "Bob", "age": 25},
...     {"name": "Charlie", "city": "San Francisco"}
... ]
>>> convert_to_columnar(items)
{
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [30, 25, None],
    'city': ['New York', None, 'San Francisco']
}

chdb.utils.flatten_dict

ネストされた辞書をフラット化します。

この関数はネストされた辞書を受け取り、区切り文字でネストされたキーを連結してフラット化します。辞書のリストは JSON 文字列としてシリアライズされます。

構文

chdb.utils.flatten_dict(d: Dict[str, Any], parent_key: str = '', sep: str = '_') → Dict[str, Any]

パラメータ

パラメータ デフォルト 説明
d Dict[str, Any] 必須 フラット化する辞書
parent_key str "" 各キーの先頭に付けるベースキー
sep str "_" 連結したキーの間に使用する区切り文字

戻り値

戻り値の型 説明
Dict[str, Any] フラット化された辞書

>>> nested_dict = {
...     "a": 1,
...     "b": {
...         "c": 2,
...         "d": {
...             "e": 3
...         }
...     },
...     "f": [4, 5, {"g": 6}],
...     "h": [{"i": 7}, {"j": 8}]
... }
>>> flatten_dict(nested_dict)
{
    'a': 1,
    'b_c': 2,
    'b_d_e': 3,
    'f_0': 4,
    'f_1': 5,
    'f_2_g': 6,
    'h': '[{"i": 7}, {"j": 8}]'
}

chdb.utils.infer_data_type

値のリストに対して、最も適したデータ型を推論します。

この関数は値のリストを調べ、そのリスト内のすべての値を表現できる 最も適切なデータ型を判定します。整数、符号なし整数、Decimal、浮動小数点型を考慮し、 いずれの数値型でも値を表現できない場合、またはすべての値が None の場合は、 デフォルトで「string」を返します。

構文

chdb.utils.infer_data_type(values: List[Any]) → str

パラメーター

パラメーター 説明
values List[Any] 分析対象の値のリスト。値の型は問いません

戻り値

戻り値の型 説明
str 推論されたデータ型を表す文字列。返される可能性がある値は次のとおりです: ”int8”, “int16”, “int32”, “int64”, “int128”, “int256”, “uint8”, “uint16”,“uint32”, “uint64”, “uint128”, “uint256”, “decimal128”, “decimal256”, “float32”, “float64”, または “string”。

chdb.utils.infer_data_types

列指向のデータ構造における各カラムのデータ型を推論します。

この関数は各カラムの値を解析し、データのサンプルに基づいて、各カラムに最も適したデータ型を推論します。

構文

chdb.utils.infer_data_types`(column_data: Dict[str, List[Any]], n_rows: int = 10000) → List[tuple]

パラメータ

パラメータ デフォルト 説明
column_data Dict[str, List[Any]] required キーがカラム名、値が各カラムの値のリストである辞書
n_rows int 10000 型推論のためにサンプルとして取得する行数

戻り値

戻り値の型 説明
List[tuple] 各要素がカラム名とその推論されたデータ型を含むタプルであるリスト

抽象基底クラス

class chdb.rwabc.PyReader(data: Any)`

基底クラス: ABC

class chdb.rwabc.PyReader(data: Any)

abstractmethod read

指定されたカラムから指定した数の行を読み込み、オブジェクトのリストを返します。 各オブジェクトは、1 つのカラムに対応する値の数列です。

abstractmethod (col_names: List[str], count: int) → List[Any]

パラメータ

パラメータ 説明
col_names List[str] 読み取るカラム名のリスト
count int 読み取る最大の行数

戻り値

戻り値の型 説明
List[Any] 各カラムに対応する数列のリスト

class chdb.rwabc.PyWriter

基底クラス: ABC

class chdb.rwabc.PyWriter(col_names: List[str], types: List[type], data: Any)

abstractmethod finalize

ブロックから最終データを組み立てて返します。サブクラスで実装する必要があります。

abstractmethod finalize() → bytes

戻り値

戻り値の型 説明
bytes 最終的にシリアライズされたデータ

abstractmethod write

データのカラムをブロックに書き込みます。サブクラスで実装する必要があります。

abstractmethod write(col_names: List[str], columns: List[List[Any]]) → None

パラメータ

パラメータ 説明
col_names List[str] 書き込まれるカラム名のリスト
columns List[List[Any]] カラムデータのリスト。各カラムはリストとして表されます

例外処理

class chdb.ChdbError

基底クラス: Exception

chDB 関連のエラー用の基本例外クラスです。

この例外は、chDB のクエリ実行が失敗した場合や、 実行中にエラーが発生した場合に送出されます。標準の Python の Exception クラスを継承しており、 基盤となる ClickHouse engine からのエラー情報を提供します。

通常、この例外メッセージには、構文エラー、型の不一致、存在しない table やカラム、その他のクエリ実行に関する問題など、 ClickHouse から返される詳細なエラー情報が含まれます。

変数

変数 説明
args - エラーメッセージと追加の argument を含む Tuple

>>> try:
...     result = chdb.query("SELECT * FROM non_existent_table")
... except chdb.ChdbError as e:
...     print(f"Query failed: {e}")
Query failed: Table 'non_existent_table' doesn't exist
>>> try:
...     result = chdb.query("SELECT invalid_syntax FROM")
... except chdb.ChdbError as e:
...     print(f"Syntax error: {e}")
Syntax error: Syntax error near 'FROM'

バージョン情報

chdb.chdb_version = ('3', '6', '0')

組み込みの不変シーケンスです。

引数が指定されない場合、コンストラクタは空のタプルを返します。 iterable が指定されている場合、タプルは iterable の要素で初期化されます。

引数がタプルの場合、戻り値は同じオブジェクトです。


chdb.engine_version = '25.5.2.1'

str(object=’’) -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

指定されたオブジェクトから新しい文字列オブジェクトを作成します。encoding または errors が指定されている場合、そのオブジェクトは、指定されたエンコーディングと エラーハンドラーを使ってデコードされるデータバッファを公開している必要があります。 それ以外の場合は、object._str_() の結果 (定義されている場合) 、 または repr(object) を返します。

  • encoding のデフォルトは ‘utf-8’ です。
  • errors のデフォルトは ‘strict’ です。

chdb.__version__ = '3.6.0'

str(object=’’) -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

指定されたオブジェクトから新しい文字列オブジェクトを作成します。encoding または errors が指定されている場合、オブジェクトはデータバッファを提供している必要があり、 そのデータは指定された encoding とエラーハンドラーを使ってデコードされます。 それ以外の場合は、object._str_() の結果 (定義されている場合) または repr(object) を返します。

  • encoding のデフォルトは ‘utf-8’ です。
  • errors のデフォルトは ‘strict’ です。
Navigation