03 03 2013 Python Flask SQLAlchemy Tweet
SQLAlchemyを使う
SQLAlchemyを使ってModelをデザインしていきます。今回はdeclarativeを使い、RDBにSQLiteを利用します。
modelは一ヶ所で管理したいのでディレクトリを新たに用意します。
mkdir flaski # flaski/flaski cd flaski touch __init__.py
ディレクトリをmoduleとして呼び出したいので、__init__.pyという空のファイルを用意します。flaski/flaski以下は次のファイル構成になります。
├── flaski ├── __init__.py ├── database.py └── models.py
作成するのはWikiなのでタイトル、内容、タイムスタンプをデータベースに記録します。
models.py
from sqlalchemy import Column, Integer, String, Text, DateTime from flaski.database import Base from datetime import datetime class WikiContent(Base): __tablename__ = 'wikicontents' id = Column(Integer, primary_key=True) title = Column(String(128), unique=True) body = Column(Text) date = Column(DateTime, default=datetime.now()) def __init__(self, title=None, body=None, date=None): self.title = title self.body = body self.date = date def __repr__(self): return '<Title %r>' % (self.title)
WikiContentクラスではそれぞれの属性の型や主キー、ユニークかどうかなどを指定しています。__repr__メソッドでは出力した時にどう表示させるかを定義しています。
続いて、database.py
from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base import os databese_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'wiki.db') engine = create_engine('sqlite:///' + databese_file, convert_unicode=True) db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) Base = declarative_base() Base.query = db_session.query_property() def init_db(): import flaski.models Base.metadata.create_all(bind=engine)
database.pyでは実際に利用されるデータベースエンジンの設定をしています。今回はSQLiteを使っています(6行目) init_dbはデータベース初期化のための関数です。
データベース初期化
python対話環境を起動してデータベースを初期化します。
>>> from flaski.database import init_db >>> init_db()
flaski/flaski/wiki.dbが作成されているので確認してみます。
sqlite3 flaski/wiki.db sqlite> .schema CREATE TABLE wikicontents ( id INTEGER NOT NULL, title VARCHAR(128), body TEXT, date DATETIME, PRIMARY KEY (id), UNIQUE (title) );
続いて対話環境からデータを登録してみます
>>> from flaski.database import db_session >>> from flaski.models import WikiContent >>> c1 = WikiContent("Flask", "micro framework") >>> db_session.add(c1) >>> db_session.commit() >>> c2 = WikiContent("python", "pppython") >>> c3 = WikiContent("kobito", "kakure-momojiri") >>> db_session.add(c2) >>> db_session.add(c3) >>> db_session.commit()
確認してみます
$ sqlite3 flaski/wiki.db SQLite version 3.7.10 2012-01-16 13:28:40 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from wikicontents; 1|Flask|micro framework|2013-03-03 09:23:03.721257 2|python|pppython|2013-03-03 09:23:03.721257 3|kobito|kakure-momojiri|2013-03-03 09:23:03.721257
ここまでのGitHub
まとめ
SQLAlchemyのdeclarativeを使ってモデル構築と、pythonからデータベースの初期化、データの登録を行いました。