Python on Pyramid SQLAlchemy編

お疲れ様です、
「Python!」と言われると
自分のことかと思って振り向いてしまう竹上です。

Python on PyramidでWebアプリケーション開発 SQLAlchemy編です。

前回の記事「Python on Pyramid 設定編」で
PyramidプロジェクトでPostgreSQLでDBを使う下準備ができたので、
実際にアプリケーションで使用するDBを設計していきます。

今回は単純にテーブルの内容をブラウザ上に表示するところまでやっていきます。

作成したプロジェクトの各設定ファイルがあるディレクトリに
プロジェクト名のディレクトリがあります。

project_name/project_name/

このディレクトリにあるのがWebアプリケーションのソースになります。

scripts
static
templates
__init__.py
models.py
views.py

というディレクトリやファイルがあります。
テーブルの定義がしてあるのは

models.pyです。

適当なエディタで開いてください。

中にごちゃごちゃ書いてありますが、
前回の記事で作成されたテーブル定義は
こいつになります。

models.py(21行目らへん)

class MyModel(Base):
__tablename__ = 'models'
id = Column(Integer, primary_key=True)
name = Column(Text)
value = Column(Integer)

このファイルでBaseクラスを継承したクラスが、
ORMとして定義されます。

サンプルなのでこのまま使ってもいいのですが、
せっかくなので定義を書き直してみましょう。
MyModelクラスの定義を削除し、代わりに下記のコードに書き換えてください。

models.py(21行目らへん)

class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
name = Column(Text)
value = Column(VARCHAR(255), nullable=False)
created = Column(TIMESTAMP, default=datetime.now())

今回は上限付きの文字列VARCHAR型と
生成日のTIMESTAMP型のカラムを使うので、
先頭のsqlalchemyパッケージのimport文に
二つの型の宣言を追加します。
デフォルトで現在時刻を使いたい場合はdatetimeをimportします。

models.py(1行目)

from sqlalchemy import (
Column,
Index,
Integer,
Text,
VARCHAR,
TIMESTAMP
)

from datetime import datetime

検索はしないので最後の行のIndex文はコメントアウトしておきましょう。

models.py(最後らへん)

# Index('my_index', MyModel.name, unique=True, mysql_length=255)

scripts下にあるinitialized.pyに
MyModelが残っているので消しておきます。

scripts/initialized.py(14行目らへん)

from ..models import (
DBSession,
Post,
Base,
)

初期値を登録しているところはいらないので削除しておきます。

scripts/initialize.py(38行目らへん)

with transaction.manager:
model = MyModel(name='one', value=1)
DBSession.add(model)

を削除

ちなみに初期値を登録したい場合は
initializedb.pyに書いておくと
initialize_project_name_db
コマンドを実行したときに登録してくれます。

MyModelの残骸を全て削除したら
前回やったinitialize_project_name_db developmentを実行します。

$ initialize_project_name_db debelopment

DB
project_db=# \dt
List of relations
Schema | Name | Type | Owner
--------+--------+-------+--------------
public | models | table | pyramid_user
public | posts | table | pyramid_user
(2 rows)

こんな感じで

最初に作成したmodelsテーブルと
さっき定義をしたpostsテーブルが作成されています。

modelsは使わないのでdropして構わないです。

project_db=# drop table models;

表示用のダミーデータを入れます。

project_db=# INSERT INTO posts (name, value, created)
VALUES
('test1', 'value1', NOW()),
('test2', 'value2', NOW()),
('test3', 'value2', NOW())
;

project_db=# SELECT * FROM posts;
id | name | value | created
----+-------+--------+----------------------------
1 | test1 | value1 | 2014-09-08 23:40:18.883059
2 | test2 | value2 | 2014-09-08 23:40:18.883059
3 | test3 | value2 | 2014-09-08 23:40:18.883059

ばっちりです。

ORMを使って画面にDBの内容を表示します。

views.py

from pyramid.response import Response
from pyramid.view import view_config

from sqlalchemy.exc import DBAPIError

from .models import (
DBSession,
Post
)

@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):

# postsテーブルの内容を全て取得
models = DBSession.query(Post).all()

# テンプレートに取得したレコードを渡す
return { 'models': models }

viewsの関数のreturnで辞書オブジェクトを返却すると
テンプレート側で使うことができます。
return先は
@view_configデコレータのrendererにあるファイルになります。

デフォルトではchameleonでレンダリングされますが、
文法がよくわからないので雑にかきますよ!

templates/mytemplate.pt

${models[0]}
${models[0].id}
${models[0].name}
${models[0].value}
${models[0].created}

${models[1]}
${models[1].id}
${models[1].name}
${models[1].value}
${models[1].created}

${models[2]}
${models[2].id}
${models[2].name}
${models[2].value}
${models[2].created}

うーん。。。ピラミッド!!!

これでおっけーです。
準備ができたら
terminalでdevelopment.iniがあるディレクトリに移動して

$ pserve development.ini

を実行後、
http://localhost:6543
にアクセスしてください。

上手く行けば先ほど入れたダミーデータが表示されます。

やったね!

次はjinja2でテンプレートを作成します!

おやすみなさい。

コメントを残す

メールアドレスが公開されることはありません。