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




  1.     def connect(self, config):
  2.         config = dict(config.items())
  3.         for key, value in keys_fix.items():
  4.             config[value] = config[key]
  5.             del config[key]
  6.         #config['autocommit'] = True
  7.         config['cursorclass'] = cursor_class
  8.         return self.get_api().connect(**self.get_config(config))




サンプルを作成して実行。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. for row in results:
  16.     print row['address']




MySQLの場合、プレースフォルダーは「?」でなく「%s」を使用すれば良いようです。


# python sample.py
北海道札幌市中央区以下に掲載がない場合








Query Builder



上記SQL直接実行のソースをQuery Builderを使用したパターンに変更してみます。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. #results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. #for row in results:
  16. #    print row['address']
  17. result = db.table('zip').where('zip_code', '0600000').first()
  18. print result['address']




もちろん、同じ実行結果になります。


# python sample.py
北海道札幌市中央区以下に掲載がない場合







もう少し進んだサンプル



郵便番号が0600000,0600001の住所を取得。
郵便番号の逆順で並び替えてみます。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. #results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. #for row in results:
  16. #    print row['address']
  17. #result = db.table('zip').where('zip_code', '0600000').first()
  18. #print result['address']
  19. results = db.table('zip').where_in('zip_code', ['0600000','0600001']).order_by('zip_code', 'desc').get()
  20. for row in results:
  21.     print row['address']




実行結果


# python sample.py
北海道札幌市中央区北一条西(1~19丁目)
北海道札幌市中央区以下に掲載がない場合




関連記事

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ