SQLAlchemy はPython製のORマッパーです。今回はこのSQLAlchemyを利用してModelをデザインしていきますが、 そのなかの declarative という仕組みを利用します。
これを利用するとPythonのクラスをリレーショナルデータベースに簡単にマップ出来るので便利です。
まず、modelは一ヶ所で管理したいのでディレクトリを新たに用意します。
mkdir flaski # flaski/flaski
cd flaski
touch __init__.py
Note
pythonはディレクトリに __init__.pyというファイルを置くとimportできるようになります。
ディレクトリを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
SQLAlchemyを利用してSQLiteにデータが登録されることを確認できました。