SwaggerでWeb APIを作る - DBと連携する
前の記事で書いたWeb APIを今度はDBと連携させる。前回までは辞書オブジェクトにデータを保存していたので、アプリケーションを再起動させるとPOSTしたデータが失われることになる。
DBとしてSQLiteを使ってみる。 業務では専らPostgreSQLなんだけど、開発時や組み込みで使われることがある(らしい)。
まずはdb.py
を作り、下記のような接続処理を書く。
create_engine
の引数では、DBの接続パスと、文字列をunicode文字列として扱うようにcovert_unicode=True
を指定する。
次にモデルを定義する。モデルで定義した属性は、そのままDBの属性となる(O/Rマッピング機能)。
Pet
モデルを以下のように定義する。
as_dict()
は、検索系のAPIで辞書データを返す必要があるため、そのようなメソッドを用意している。
モデルまで作成したので、モデルからDBを初期化する。
$ python -c "from db import init_db; init_db()" $ cat petstore.db nn??tablepetspetsCREATE TABLE pets ( id INTEGER NOT NULL, name VARCHAR(100), tag VARCHAR(20), created DATETIME, PRIMARY KEY (id)
コントローラー部分は、DB連携のためPet
モデルの処理とdb_session
の操作を追加している。
petstore/default_controller.py
一覧取得find_pets
は、複数のタグによる検索が可能となっているので、リストでtags
が取得される。それを条件に展開するので、Pet.tag == tag
をリストの要素分作って、sqlalchemy._or()
の要素に展開するように実装している。
またlimit
による件数の制限は、取得したものについて行うようにしている(本当は検索するときに指定すべき)。
or_filters = or_(*[Pet.tag == tag for tag in tags]) pets = Pet.query.filter(or_filters).all()