Python Pylons モデルの使用(sqlite連携)



Pylonsでデータベースに接続する方法です。

QuickWiki チュートリアル
http://wiki.pylonshq.com/pages/viewpage.action?pageId=10027064
を参考にプログラムを作成しようとしたのですが・・・

アプリケーションの配布に関することも含まれており、
私にはちょっと難しかったです。

そこで、アプリケーションの配布やデータベースの初期化に
関することは抜きにして、動作させるための最低限の
設定を試してみます。


まず、データベースの設定について、
development.ini
に記載します。

[app:main]
のセクションの最後に


# invalidate the URI when specifying a SQLite db via path name
sqlalchemy.default.url = sqlite:///%(here)s/helloworld.db
#生成されたSQL文を見たい場合
#sqlalchemy.default.echo = true


と、sqliteのデータファイルの場所(接続文字列)を記載します。


次に、
/config/environment.py
にdevelopment.iniで記載した内容を取得するロジックを追加します。


#このfromを追加
from sqlalchemy import engine_from_config

#def load_environment(global_conf, app_conf):メソッドの末尾に
config['pylons.g'].sa_engine = engine_from_config(config, 'sqlalchemy.default.')


これで、configに記載したsqlalchemy.defaultの内容を
config['pylons.g'].sa_engineに反映します。



次に、
/model/__init__.py
に、
・データベース接続用のセッション
・モデルオブジェクト
の記載を行います。


from pylons import config
from sqlalchemy import Column, MetaData, Table, types
from sqlalchemy.orm import mapper
from sqlalchemy.orm import scoped_session, sessionmaker

#セッション生成
Session = scoped_session(sessionmaker(autoflush=True, autocommit=True, bind=config['pylons.g'].sa_engine))

metadata = MetaData()

#テーブル定義
pages_table = Table('pages', metadata,
  Column('id', types.Integer(), primary_key=True),
  Column('title', types.Unicode(), default=''),
  Column('content', types.Unicode(), default='')
)


#pagesテーブルを操作するオブジェクト
class Page(object):
  def __str__(self):
    return self.title

mapper(Page, pages_table)



次に、
/lib/base.py
に、/model/__init__.pyで生成したSessionがコントローラーで使用できるよう
ロジックの追加を行います。


#このfromを追加
from helloworld.model import Session

#def __call__(self, environ, start_response):の内容を修正
  try:
    return WSGIController.__call__(self, environ, start_response)
  finally:
    Session.remove()



これでやっとコントローラーでデータベースに登録されている
内容を取得できるようになりました。

コントローラ「page」を作成します。
#paster controller page


コントローラーpage.pyはこんな感じです。


import logging

from helloworld.lib.base import *

#このfromを追加
from helloworld.model import Page

log = logging.getLogger(__name__)

class PageController(BaseController):
  def index(self):
    c.titles = [page.title for page in Session.query(Page).all()]
    return render('/list.mako')


最後に
/templates/list.mako
を作成します。
※コントローラーから渡されたタイトルを表示するだけ。


% for title in c.titles:
  • ${title}

  • % endfor



    まだデータベースファイルが存在していないので、
    こんなプログラムを実行して、データベースを作成します。
    ※まだ、Python2.4を使っているので、pysqlite2を使用しています。
    2.5以降であれば、sqlite3でよいはず。


    DataBaseセットアップ用プログラム


    from pysqlite2 import dbapi2 as sqlite

    con = sqlite.connect("helloworld.db")
    cur = con.cursor()
    cur.execute("""
    create table pages(
    id int not null primary key,
    title text default '',
    content text default ''
    )
    """)
    con.commit()

    cur.execute("insert into pages(id,title,content) values (1,'title_data1','content_data1')")
    cur.execute("insert into pages(id,title,content) values (2,'title_data2','content_data2')")
    cur.execute("insert into pages(id,title,content) values (3,'title_data3','content_data3')")
    cur.execute("insert into pages(id,title,content) values (4,'title_data4','content_data4')")
    cur.execute("insert into pages(id,title,content) values (5,'title_data5','content_data5')")
    con.commit()

    cur.execute("select * from pages")
    print 'updated data'
    for r in cur:
      print r
    cur.close()
    con.close()




    サーバを起動して、ページを見てみます。


    #paster serve --reload development.ini


    http://localhost:5000/page/




    各ファイルの関係はこんな感じでしょうか?




    もどる