PyPika とは
kayak/pypika は、 Python の SQL クエリビルダーです。本記事ではこのライブラリの中心となる Query、 Table の使い方について紹介します。
環境
公式に記載のサポートされている Python のバージョンは 3.6
以上。今回使用している Python のバージョンは 3.9.10
です。 PyPika のバージョンは、0.48.8
を使用しています。
#1. Query
名前の通り Query
クラスを使用して SQLクエリを組み立てることができます。
以下は、 SELECT
文の例です。from_ メソッドを使用して組み立てることができます。実態は QueryBuilder クラスの from_ メソッドを呼んでおり、続けて select メソッドを使用する事により SELECT 文を組み立てています。クエリ文字列として出力する際は get_sql メソッド を使用します。
from pypika import Query
q = Query.from_('users').select('id', 'name', 'email')
print(q.get_sql())
# 出力
# SELECT "id","name","email" FROM "users"
ちなみに __str__
メソッド にも get_sql メソッド を呼ぶように設定されているので q
のまま print しても同じ結果となります。
それぞれ RDBMS によって、Query のサブクラスが提供されています。今回は、 MySQL を例に説明していきます。 MySQL の場合はダブルクォーテーションでエラーになってしまうので、Query
クラスのサブクラスである MySQLQuery を使用する必要があります。 Oracle や Postgre も同じように dialects ファイルでサブクラスが定義されていますので必要に応じて読み替えてください。
from pypika import MySQLQuery as Query
q = Query.from_('users').select('id', 'name', 'email')
print(q.get_sql())
# 出力
# SELECT `id`,`name`,`email` FROM `users`
INSERT
INSERT
文を組み立てる場合は、 into メソッドを使用します。実態は、 QueryBuilder クラスの into メソッドを呼んでいるので、続けて insert メソッド を使用することにより INSERT
文を組み立てることができます。
from pypika import MySQLQuery as Query
q = Query.into('users').insert(1, 'Taro', 'taro@example.com')
print(q.get_sql())
# 出力
# INSERT INTO `users` VALUES (1,'Taro','taro@example.com')
UPDATE
UPDATE
文を組み立てる際は、update メソッドを使用します。実態は、 QueryBuilder クラスの update メソッド を呼んでいるので、続けて set メソッド を使用することにより UPDATE
文を組み立てることができます。
from pypika import MySQLQuery as Query
q = Query.update('users').set('name', 'Jiro')
print(q.get_sql())
# 出力
# UPDATE `users` SET `name`='Jiro'
DELETE
from_
メソッドを呼ぶのは SELECT
文のときと同じです。DELETE
文を組み立てる際は delete メソッドを使用します。
from pypika import MySQLQuery as Query
q = Query.from_('users').delete()
print(q.get_sql())
# 出力
# DELETE FROM `users`
#2. Table
以下のように、 Table クラスを使用してもクエリを組み立てることができます。
from pypika import Table
users = Table('users')
q = users.select(users.id, users.name, users.email)
print(q.get_sql())
# 出力
# SELECT "id","name","email" FROM "users"
コードを読むと内部では Query クラスを使用しているので、本記事冒頭で触れた SELECT
文の組み立てと同じことを行っています。Query
クラスのサブクラスである MySQLQuery を使用する際は以下のように _query_cls
に設定する必要があります。
from pypika import MySQLQuery, Table
users = Table('users', query_cls=MySQLQuery)
q = users.select(users.id, users.name, users.email)
print(q.get_sql())
# 出力
# SELECT `id`,`name`,`email` FROM `users`
INSERT
Table クラスで INSERT
文を組み立てる場合は、 insert メソッドを使用します。
from pypika import MySQLQuery, Table
users = Table('users', query_cls=MySQLQuery)
q = users.insert(1, 'Taro', 'taro@example.com')
print(q.get_sql())
# 出力
# INSERT INTO `users` VALUES (1,'Taro','taro@example.com')
UPDATE
Table クラスで UPDATE
文を組み立てる場合は、 update メソッドを使用します。
from pypika import MySQLQuery, Table
users = Table('users', query_cls=MySQLQuery)
q = users.update().set(users.name, 'Jiro')
print(q.get_sql())
# 出力
# UPDATE `users` SET `name`='Jiro'
DELETE
Table クラス を見てわかる通り、 DELETE
はサポートしていません。 前述の Query クラスで組み立てる他なさそうです。
#3. まとめ
本記事では、 PyPika の Query と Table の基本的な使い方について紹介しました。日本語のドキュメントが少ないかつ結合など他にも色々な組み立てができるので今後も記事を書いていけたらと思います。