LoginSignup
12
9

More than 5 years have passed since last update.

PythonでMySQLを操作するRESTを作る

Last updated at Posted at 2018-02-10

概要

前提として、本記事は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データ形式で返します。

server.py
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接続がタイムアウトしている可能性があるので、リクエスト受付時に接続、切断するようにしました。

参考記事

12
9
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
12
9