Python Query Builder「Orator」のインストールと使い方
しっかりしたORMツールではなく、CodeIgniterに搭載されているQuery BuilderのようなSQL文の構築を楽にしてくれるライブラリがPythonにないか探していたところ、
「Orator」を見つけました。
https://orator-orm.com/
ORMがメインですが、Query Builderの機能もあるようです。
https://orator-orm.com/docs/0.8/query_builder.html
Debian 8にインストールして使ってみます。
インストール
まず、必要なライブラリをインストール
# apt-get install python-dev python-setuptools g++
orator自身はeasy_installでインストールしました。
# easy_install orator
ここで
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
というエラーが発生する場合は、ca-certificatesをインストールすればOKです。
Debian easy_installで[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
# apt-get install ca-certificates
簡単なサンプル
CodeIgniter3 JSONを返すAPIサーバーとして使用する
こちらで使用した郵便番号テーブルを検索してみます。
サーバー:localhost
データベース:sample
ユーザー:root
パスワード:P@ssw0rd
テーブルの構成はこんな感じ。
create table zip (
zip_code char(7) not null primary key,
address varchar(200)
);
MariaDBを使用しているので、接続用のライブラリをインストールしておきます。
# apt-get install python-mysqldb
こちらを参考に、データベースに接続。
直接SQL文を実行してみます。
Basic Usage
その前に、0.8.1だとこんなエラーが発生しました。
TypeError: 'autocommit' is an invalid keyword argument for this function
orator/connectors/mysql_connector.pyを編集。
35行目の「config['autocommit'] = True」をコメントします。
# vi /usr/local/lib/python2.7/dist-packages/orator-0.8.1-py2.7.egg/orator/connectors/mysql_connector.py
- def connect(self, config):
- config = dict(config.items())
- for key, value in keys_fix.items():
- config[value] = config[key]
- del config[key]
- #config['autocommit'] = True
- config['cursorclass'] = cursor_class
- return self.get_api().connect(**self.get_config(config))
サンプルを作成して実行。
- # -*- coding:utf-8 *-
- from orator import DatabaseManager
- config = {
- 'mysql': {
- 'driver': 'mysql',
- 'host': 'localhost',
- 'database': 'sample',
- 'user': 'root',
- 'password': 'P@ssw0rd',
- 'prefix': ''
- }
- }
- db = DatabaseManager(config)
- results = db.select("select * from zip where zip_code = %s", ['0600000'])
- for row in results:
- print row['address']
MySQLの場合、プレースフォルダーは「?」でなく「%s」を使用すれば良いようです。
# python sample.py
北海道札幌市中央区以下に掲載がない場合
Query Builder
上記SQL直接実行のソースをQuery Builderを使用したパターンに変更してみます。
- # -*- coding:utf-8 *-
- from orator import DatabaseManager
- config = {
- 'mysql': {
- 'driver': 'mysql',
- 'host': 'localhost',
- 'database': 'sample',
- 'user': 'root',
- 'password': 'P@ssw0rd',
- 'prefix': ''
- }
- }
- db = DatabaseManager(config)
- #results = db.select("select * from zip where zip_code = %s", ['0600000'])
- #for row in results:
- # print row['address']
- result = db.table('zip').where('zip_code', '0600000').first()
- print result['address']
もちろん、同じ実行結果になります。
# python sample.py
北海道札幌市中央区以下に掲載がない場合
もう少し進んだサンプル
郵便番号が0600000,0600001の住所を取得。
郵便番号の逆順で並び替えてみます。
- # -*- coding:utf-8 *-
- from orator import DatabaseManager
- config = {
- 'mysql': {
- 'driver': 'mysql',
- 'host': 'localhost',
- 'database': 'sample',
- 'user': 'root',
- 'password': 'P@ssw0rd',
- 'prefix': ''
- }
- }
- db = DatabaseManager(config)
- #results = db.select("select * from zip where zip_code = %s", ['0600000'])
- #for row in results:
- # print row['address']
- #result = db.table('zip').where('zip_code', '0600000').first()
- #print result['address']
- results = db.table('zip').where_in('zip_code', ['0600000','0600001']).order_by('zip_code', 'desc').get()
- for row in results:
- print row['address']
実行結果
# python sample.py
北海道札幌市中央区北一条西(1~19丁目)
北海道札幌市中央区以下に掲載がない場合