LoginSignup
4
1

More than 1 year has passed since last update.

PyPika の Query、Table の基本的な使い方

Posted at

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 の基本的な使い方について紹介しました。日本語のドキュメントが少ないかつ結合など他にも色々な組み立てができるので今後も記事を書いていけたらと思います。

参考リンク

kayak/pypika

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1