================== SQLAlchemyを使う ================== `SQLAlchemy `_ はPython製のORマッパーです。今回はこのSQLAlchemyを利用してModelをデザインしていきますが、 そのなかの `declarative `_ という仕組みを利用します。 これを利用するとPythonのクラスをリレーショナルデータベースに簡単にマップ出来るので便利です。 まず、modelは一ヶ所で管理したいのでディレクトリを新たに用意します。 .. code-block:: sh mkdir flaski # flaski/flaski cd flaski touch __init__.py .. note:: pythonはディレクトリに __init__.pyというファイルを置くとimportできるようになります。 ディレクトリをmoduleとして呼び出したいので、__init__.pyという空のファイルを用意します。flaski/flaski以下は次のファイル構成になります。 .. code-block:: sh ├── flaski    ├── __init__.py    ├── database.py    └── models.py Wikiをつくるのでタイトル、内容、タイムスタンプをデータベースに記録できるようにします。 models.py .. code-block:: python 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 '' % (self.title) WikiContentクラスではそれぞれの属性の型や主キー、ユニークかどうかなどを指定しています。__repr__メソッドでは出力した時にどう表示させるかを定義しています。 続いてdatabase.pyを用意します .. code-block:: python 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対話環境を起動してデータベースを初期化します。 .. code-block:: python >>> from flaski.database import init_db >>> init_db() flaski/flaski/wiki.dbが作成されているので確認してみます。 .. code-block:: sh 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) ); 続いて対話環境からデータを登録してみます .. code-block:: python >>> 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() 確認します。 .. code-block:: sh $ 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にデータが登録されることを確認できました。 ここまでのGitHub ================ - `モデルの設定 <https://github.com/kzfm/flaski/commit/47c3730f437962e9a6426e12d9b26b5c83bc042f>`_