概要
前提として、本記事はpythonでDB操作をする初心者さん向けです。
PythonのORマッパーであるPeeweeを使って、簡単なREST APIを作ります。
とりあえずここでは、GETで取得したURLからIDを取り出し、MySQLに接続して指定のデータを取り出す方法を示します。
同様の記事はQiitaにもたくさんありますが、個人的にハマったポイントを加えて解説します。
使用モジュール
- peewee (MySQLを操作するためのORマッパー)
- Flask (WEBサーバー)
インストール
pipでいくつかのモジュールをインストールします。
$ pip install flask peewee PyMySQL
peeweeからMySQLへ繋ぐためにはドライバーが必要なため、前述の使用モジュールに加えて「PyMySQL」を入れています。(これが意外と解説記事には書かれていなくてハマります。。)
ソースコード
下記に例を示します。
この例では /items/(itemのID) をGETで受け取ったとき(例:http://[ドメイン]/items/101)
result(取得結果)とdata(結果データ)をJSONデータ形式で返します。
from flask import Flask, jsonify, abort, make_response
import peewee as pe
db = pe.MySQLDatabase('db_name', user='user_name', password='password',host='host_name')
class UnknownField(object):
def __init__(self, *_, **__): pass
# モデル共通
class BaseModel(pe.Model):
class Meta:
database = db
# データテーブルのモデル
class Items(BaseModel):
id = pe.IntegerField()
itemUrl = pe.CharField()
itemData = pe.TextField()
insertDate = pe.DateTimeField()
class Meta:
db_table = 'itemDdata' # テーブル名を指定
api = Flask(__name__)
# itemの詳細情報を取得
@api.route('/items/<int:id>', methods=['GET'])
def getItemData(id):
itemCodeList = []
db.connect()
try:
data = Items.select(Items.itemData).where(Items.id == id)
# SQL文で言うと "SELECT itemData FROM itemData Where id = (GETで受け取ったID)"
except Items.DoesNotExist:
db.close()
abort(404)
result = {
"result": True,
"data": data.itemData
}
db.close()
return make_response(jsonify(result))
@api.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
if __name__ == '__main__':
api.run(host='0.0.0.0',port=80,debug=False) #host=0.0.0.0を指定することで外部からアクセス可能になる
解説
FlaskはWEBサーバーとして動作しており、外部からのリクエストを受け付けます。
サーバーを起動するときはrunメソッドを実行しますが、host記述を省略すると自動的に自身(127.0.0.1)を指定します。
ただしここにハマりポイントがあり、実はこの形だと外部からのリクエストを受け付けません。外部リクエストを受け付けるには、host='0.0.0.0'を明示的に指定する必要があります。
peeweeはORマッパーですが、sqlを操作するにはまず「モデル」を作り、それに対して操作を記述する必要があります。
上記ソースでは「Items」クラスを作って、各カラムのフィールドタイプを指定し、db_tableで対象のテーブルを指定しています。
指定できるフィールドタイプの一覧はこちら。
http://docs.peewee-orm.com/en/latest/peewee/models.html#field-types-table
まとめ
今回は簡易説明のためGETのみの解説としましたが、ここまで分かれば他もわりと簡単だと思います。
記事にも書きましたが、改めて個人的にハマったポイントは
- PyMySQLのインストールが必要
- Flaskは自身を指定する場合でも記述を省略せずhost='0.0.0.0'を指定
- Peeweeはまず「モデル」を作って、テーブル名はdb_tableで指定
です。この記事が誰かの手助けになれば幸いです。
追記(2018/2/15)
db.connect()とdb.close()を追加しました。
RESTを受け付けるサーバーの場合、通常はwebサーバーは起動したままとなり待ちの状態となるのですが、起動したときにDB接続しただけではリクエストを受け付けたときにDB接続がタイムアウトしている可能性があるので、リクエスト受付時に接続、切断するようにしました。