Skip to content

TornadoとSQLAlchemy

Hiroki Nakayama edited this page Jul 21, 2015 · 30 revisions

TornadoとSQLAlchemy

TornadoはDjangoのようなフルスタックのフレームワークではない。そのため、自分で必要な機能をインストールしなければならない。ORMもその一つであり、TornadoではSQLAlchemyを使うことが多いようである。そこで、本プロジェクトでもSQLAlchemyを使用するので、調べたことについて以下にまとめる。

インストール方法

インストールはpipを用いて行います。
pip install sqlalchemy

以下のページが参考。

テーブル作成

最初にsqlalchemy.create_engine(url)でエンジンを作成する。エンジンが、実際のデータベースやDBAPIにアクセスするための足場となる。その次に、Base = sqlalchemy.ext.declarative.declarative_base()でBaseを作る。このBaseを用いて、テーブルの作成や削除を行っていく。また、テーブルはclassで定義する。このときBaseと紐づけるために、クラスを定義するときに継承でBaseを指定する。そして、Base.metadata.create_all(engine)で、engineで指定したデータベースにBaseで定義されたモデルから生成されたCREATE文でテーブルを作成する。

データの追加方法

データを追加するにはセッションを使う。セッションはデータベースとの対話を担当している。データはいったんセッションに保存しておき、適切なタイミングでデータベースに書きだす。データベースにデータを追加する流れは以下の通り:

  1. セッションを作成
  2. セッションにデータを追加
  3. セッションをコミットして、追加したデータをデータベース書き込み。

参考

データの検索

基本的なfilter操作方法

テーブルの関係定義

公式サイト参考。
公式サイトのリレーションシップ
日本語のrelationship情報 http://seesaawiki.jp/w/kurt0027/d/python%20sqlalchemy%A4%CD%A4%BF

一対多

Parent内からchildren = sqlalchemy.orm.relationship('Child(クラス名)')を定義すると、ParentからChildに関係が張られる。Parentのインスタンスparentを使って、parent.childrenで子供をとってこれる。

また、children = sqlalchemy.orm.relationship('Child(クラス名)', backref='parent(参照に使用する名前)')を定義することで、ChildからParentに関係が張られる。Childのインスタンスchildから、child.parentで親をとってこれる。backrefが無いと、parent属性が存在しないので、親はオブジェクトをとってこれない。

多対多

基本は一対多と同じだが、関連テーブルを定義する必要がある。おそらく、関連テーブルを用いて、多対多の関係を2つの一対多関係に分割している。

レコードの存在チェック

sqlalchemy.sql.existsを使うと簡単。
以下参考

SQLAlchemyを使っているプロジェクトで参考になりそうなもの

モデルにメソッドを定義して、コントローラの処理を軽くしているように思われる。

SQLAlchemy全体の参考

SQLAlchemyのコードをHandlerからModelに移すときに参考になりそうなサイト

SQLAlchemyとSingleton

Clone this wiki locally