-
Notifications
You must be signed in to change notification settings - Fork 4
TornadoとSQLAlchemy
TornadoはDjangoのようなフルスタックのフレームワークではない。そのため、自分で必要な機能をインストールしなければならない。ORMもその一つであり、TornadoではSQLAlchemyを使うことが多いようである。そこで、本プロジェクトでもSQLAlchemyを使用するので、調べたことについて以下にまとめる。
インストールはpipを用いて行います。
pip install sqlalchemy
以下のページが参考。
- http://qiita.com/petitviolet/items/e03c67794c4e335b6706#3-3
- http://tell-k.github.io/pyconjp2012/
- http://wiki.liris.org/article/python_intro/python03
最初にsqlalchemy.create_engine(url)でエンジンを作成する。エンジンが、実際のデータベースやDBAPIにアクセスするための足場となる。その次に、Base = sqlalchemy.ext.declarative.declarative_base()
でBaseを作る。このBaseを用いて、テーブルの作成や削除を行っていく。また、テーブルはclassで定義する。このときBaseと紐づけるために、クラスを定義するときに継承でBaseを指定する。そして、Base.metadata.create_all(engine)で、engineで指定したデータベースにBaseで定義されたモデルから生成されたCREATE文でテーブルを作成する。
データを追加するにはセッションを使う。セッションはデータベースとの対話を担当している。データはいったんセッションに保存しておき、適切なタイミングでデータベースに書きだす。データベースにデータを追加する流れは以下の通り:
- セッションを作成
- セッションにデータを追加
- セッションをコミットして、追加したデータをデータベース書き込み。
参考
基本的な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を使うと簡単。
以下参考
- http://stackoverflow.com/questions/6587879/how-to-elegantly-check-the-existence-of-an-object-instance-variable-and-simultan
- http://stackoverflow.com/questions/7646173/sqlalchemy-exists-for-query
モデルにメソッドを定義して、コントローラの処理を軽くしているように思われる。
- https://github.com/renalreg/radar/tree/80846fd6a64c67c59fd3bfba10f2a7175827133b
- https://github.com/B1aZer/ImInIt/blob/72661a119099436d05aeccd042f471346ec20187/application/models.py
- http://yuku-tech.hatenablog.com/entry/20110723/1311387822
- http://qiita.com/takada-at/items/9f008e8f394235b72c6e