
【次世代高速RDB劔"Tsurugi"】Tsurugi Python DB-APIの実装
2026年4月6日にリリースされた Tsubakuro/Rust 0.9.0(Tsurugi 1.10.0)で、Tsurugi Python DB-API(PythonでTsurugiにアクセスするクライアントライブラリー)が公開されました。
このライブラリーはPython DB API 2.0(PEP 249)に準拠し、Tsurugi独自の拡張機能を追加しています。
使用方法については Tsurugi Python DB-APIのドキュメント を参照してください。
当記事では、このライブラリーの実装について紹介します。
経緯
Tsurugiが初めてリリースされたとき、TsurugiにアクセスできるクライアントライブラリーはJava版のみでした。(Tsubakuro/Java や Iceaxe)
ただ、その当時から、C/C++のライブラリーは提供する予定でした。
これを実現したのがTsubakuro/Rustです。
Tsubakuro/RustはRustで書かれたクライアントライブラリーですが、RustではC言語用の関数を実装してC-ABI形式のライブラリーを生成することもできます。この機能を利用して、C言語で使えるクライアントライブラリー(tsubakuro-rust-ffi)を開発しました。
このtsubakuro-rust-ffiを使って、C言語の関数を呼ぶことができるPHPでは PDO TSURUGI というライブラリーが作られています。
そして、PythonもC言語の関数を呼ぶことができます。
そこで、Tsubakuro/Rustを使ってPythonのクライアントライブラリーを作成することになりました。
APIの方針
PythonがC言語の関数を呼べると言っても、どのようなAPIにするかを検討する必要があります。
以下のような方式が考えられました。
tsubakuro-rust-ffiのラッパーにする(tsubakuro-rust-ffiの各関数に1対1に対応したPython関数を用意する)
PythonのDBアクセスの標準規格に従う
前者は、C言語の関数群として既にtsubakuro-rust-ffiがあるので、単純にそれをPythonから呼ぶというアイデアです。
これなら、Tsurugiの機能(Tsubakuro/Rustで提供されている機能)を全て使うことができます。
しかしながら、Pythonのライブラリーとして提供するなら、やはりPythonの標準的なAPIに従った方が良いでしょう。という訳で、Python DB API 2.0(PEP 249)に準拠する方針になりました。
ちなみに、Python DB API 2.0にはDBのメタデータを取得するAPIは規定されていません。利便性のために、テーブル一覧を取得するメソッドやテーブル定義を取得するメソッドを独自の拡張機能として提供することにしました。
実装方式
次に決める必要があるのは、どんな方法でPythonからC言語の関数を呼ぶかです。
PythonからC言語の関数を呼ぶためのライブラリーにはctypesやcffiといったものがあるようです。
これらを使う場合、C言語の関数を呼ぶためのコーディングをPython側で色々行う必要があります。
そんな中、PyO3というRustのライブラリーを使えば、Rustで関数を実装するだけで、Pythonから呼べるライブラリーを生成できることが分かりました。
実行効率も、ctypes/cffiを使うよりPyO3を使う方が良いことが期待されます。
なぜなら、呼び出すモジュール間のデータ変換の手間が少ないからです。
ctypes/cffi方式: Python → (Pythonのデータ型をC言語のデータ型に変換) → tsubakuro-rust-ffi → (C言語のデータ型をRustのデータ型に変換) → tsubakuro-rust-core
PyO3を使う方式: Python → (Pythonのデータ型をRustのデータ型に変換) → tsubakuro-rust-python → tsubakuro-rust-core
※tsubakuro-rust-coreはTsubakuro/Rustの中核モジュール(実際にTsurugiと通信するモジュール。Rustで書かれている)で、tsubakuro-rust-pythonはTsurugi Python DB-APIの内部モジュール(Rust(PyO3)で書く)です。
こういったことを考慮し、PyO3を採用することにしました。
PyO3の使用感
実際にPyO3を使った感想ですが、PyO3はとても便利です!
通常のRustの関数の書き方で関数を記述し、PyO3が提供している属性(PythonのデコレーターやJavaのアノテーション相当)を付けるだけで、Pythonから呼び出せる関数が生成できます。
関数の引数や戻り値に使うデータ型は、Rust標準のものでも、PyO3が提供しているPythonデータ型でも使用できます。(PyO3がうまい具合に変換してくれます。dictやタプルはもちろん、decimalやdatetimeにも対応しています。(PyO3を使わずにtsubakuro-rust-ffiを呼ぶ方式だったら、どんなに面倒だったことか))
関数だけでなく、Python用のクラスやメソッドを定義することもできますし、列挙型も定義できます。
エラーの扱い方も直感的で、通常のRustの関数と同じく戻り値でErrを返せば、Pythonでは例外としてraiseされます。独自の例外クラスを作るためのマクロも提供されています。
したがって、基本的な使い方だけで済む場合は、Pythonコードを1行も書くことなく、Pythonライブラリーを生成できます。
Tsurugi Python DB-APIの場合は、内部モジュールを不可視(private相当)にする実装を行っているため、若干Pythonコードも書いていますが。
また、テストはpytestで実行できますし、wheelファイル(Pythonライブラリーを配布するためのアーカイブ)を生成するツールも提供されています。PyO3のエコシステムとして、型ヒントファイルを生成するツールもありますし、APIドキュメントのHTMLを生成するツールも利用できます。
このように、Pythonライブラリーの開発に必要なものは一通り揃っている感じなので、RustおよびPyO3はとってもお勧めです!
その他の劔"Tsurugi"を使う際に役立つTips集はコチラ!
次世代高速RDB劔"Tsurugi"は、オープンソースで公開中です。
ぜひダウンロードしてみて、触ってみてください。