Pylons入門インスタンスチュートリアル–データベース操作
8630 ワード
前の2編の入門では、Pylonsが大まかに開発したプロセス、フォーム、ファイルのアップロードについて述べています.構想は伝統的な開発とほぼ似ています.この記事では、Pylonsでデータベースをどのように使用するかについて簡単に説明します.
本編ではORMフレームSQLAlchemyの使用に重点を置きます.現在Pythonコミュニティで注目度が高いのは、SQLAlchemy、SQLObject、Stormの3つです.実は私は最初にStormを研究して、それからエビの兄(@marchliu)が応用の中であまり爽やかではないことを聞いて、彼の推薦したSQLAlchemyに注目しました.もちろん、データベースのDB-APIライブラリに対応して操作することもできます.
サンプルコードのデータベースはPostgreSQLで、対応するPythonライブラリはpsycopg 2を使用しています.Pgの配置と使用はここで邪魔にならないように、犬に頼んでください.
Debian/Ubuntuのインストールは簡単です.
testなどのテストデータベースを構築します.
データベースの部分はOKで、次はPylonsを逆さまにします.
新しいプロジェクトを作成し、サポートデータベースのセクションに追加します.Enter sqlalchemyのオプションに注意してください.デフォルトはFalseです.Trueに変更します.
Trueに変更して自動的に生成するdevelopment.iniには対応するデータベース構成オプションがあります.
新しいdbコントローラを再構築するには:
developmentを編集します.ini、データベース構成セクションを追加します.smallfish:123456は対応するPostgreSQLユーザー名/パスワード、127.0.0.1:5432は対応するホストアドレス/ポート番号、最後のtestはデータベース名です.
hellodb/model/_の編集init__.py、msgというテーブルとフィールドの定義を追加します.
例Msgテーブルは簡単で、ID、コンテンツ、時間の3つのフィールドがあります.
上のコードはsqlchemyパッケージにインポートされたいくつかのライブラリを除いて、基本的に対応するテーブルのフィールド定義があり、空のMsgオブジェクトもあります.
最後の行は、mapの動作をして、Msgをmsg_にマッピングします.table上.
次はデータベースに対応するテーブルを作成しますか?データベースを初期化する簡単な方法があります:paster setup-app development.ini:
表を作成するSQL文を含む上の出力ログが表示されます.ここでSERIALは上に対応するinit__.pyにおけるColumnのSeq定義.serialタイプはPostgreSQLでMySQLのような自増ID(auto_increment)と見なすことができる.
PostgreSQLクエリー・データベースにアクセスすると、テーブルとシーケンスが確立されていることがわかります.
ここでは、データベースの初期化、プロファイル、コントローラの例など、準備が完了しました.
次にcontrollerコードにデータベースの読み書き機能を追加しましょう.
まずフォームテンプレートdbを作成する.htm、データベース・テーブルに追加および保存するために使用される:
コントロールindexに対応して、簡単に変更できます.テンプレートに戻る:
上のformの/db/addパスに対応するaddメソッドを追加します.
部分を追加するのは簡単です.POSTテキストボックスを取得し、Msgオブジェクト(上のモデルで定義されている)を初期化します.
add以降は、データベースに本当に保存されるように手動でcommitする必要があります.
ブラウザにアクセスしてください:http://127.0.0.1:5000/db/indexああ、勝手にデータを追加しましょう.この時、PostgreSQLでデータが追加されたことを検索することができます.
次にindexメソッドでテンプレートに値を渡し、さっき追加したデータを出力します.
c.msgsはグローバル変数として理解でき,cに関する定義はcontrollerの数行前に見られるはずである.テンプレートdbを変更します.htm表示レコード:
簡単で、ただ1つの普通のfor循環で、index方式の中で伝達するc.msgsを遍歴します.Makoテンプレートはやはり読みやすいですよね?
次の更新を続行します.http://127.0.0.1:5000/db/indexあ、追加したデータがページに表示されます.
何十本も入力した後、1ページにテトガメではないかと表示されます.
次はPylonsのwebhelperのページコンポーネントの使い方を紹介します.もちろん、自分でページアルゴリズムを書くこともできます.次に例を示します.
paginateをインポートし、クエリーのデータベースオブジェクトをパラメータとしてpaginateに渡す.Page、中のpageはページの伝達ページ数パラメータ、items_per_pageはよく理解できますが、何枚か1ページです.ここは10本です.
対応するテンプレートlist.htmは以下の通りです.
forセクションは上記の例のように、次にpagerの行を追加します.中にはいくつかの変数が名前から機能を見ることができます.合計エントリ数、現在は何番目から何番目、次によく使用されるトップページ、前ページ、下ページ、最後のページが含まれます.
ここにリンクされている文字はすべて<,<,>>>.文字に変更したい場合は、ドキュメントを参照してください.最初のページであれば、最初のページと前のページは表示されません.このページングをした人は一般的に似たようなコードを書いたことがあるでしょう.
次にアクセスします.http://127.0.0.1:5000/db/listああ、効果を見たいなら、もちろんもっとデータを記入しなければなりませんよ.10個でページ分割の掘削が表示されます.
はい、ここではデータベースの追加と表示部分にサンプルコードがあります.もちろん、最後にページングの使い方があります.削除や更新などはSQLAlchemyドキュメントを参照してください.
http://chenxiaoyu.org/blog/archives/312
本編ではORMフレームSQLAlchemyの使用に重点を置きます.現在Pythonコミュニティで注目度が高いのは、SQLAlchemy、SQLObject、Stormの3つです.実は私は最初にStormを研究して、それからエビの兄(@marchliu)が応用の中であまり爽やかではないことを聞いて、彼の推薦したSQLAlchemyに注目しました.もちろん、データベースのDB-APIライブラリに対応して操作することもできます.
サンプルコードのデータベースはPostgreSQLで、対応するPythonライブラリはpsycopg 2を使用しています.Pgの配置と使用はここで邪魔にならないように、犬に頼んでください.
Debian/Ubuntuのインストールは簡単です.
sudo aptitude install python-psycopg2
testなどのテストデータベースを構築します.
smallfish@debian:~/workspace/python/hello$ su postgres
postgres@debian:/home/smallfish/workspace/python/hello$ createdb -O smallfish test
postgres@debian:/home/smallfish/workspace/python/hello$ exit
smallfish@debian:~/workspace/python/hello$ psql -h 127.0.0.1 -p 5432 -U smallfish test
smallfish :
psql (8.4.4)
SSL ( :DHE-RSA-AES256-SHA, :256)
"help" .
test=#
データベースの部分はOKで、次はPylonsを逆さまにします.
新しいプロジェクトを作成し、サポートデータベースのセクションに追加します.Enter sqlalchemyのオプションに注意してください.デフォルトはFalseです.Trueに変更します.
smallfish@debian:~/workspace/python$ paster create -t pylons hellodb
Selected and implied templates:
Pylons#pylons Pylons application template
Variables:
egg: hellodb
package: hellodb
project: hellodb
Enter template_engine (mako/genshi/jinja2/etc: Template language) ['mako']:
Enter sqlalchemy (True/False: Include SQLAlchemy 0.5 configuration) [False]: True
Creating template pylons
Creating directory ./hellodb
Trueに変更して自動的に生成するdevelopment.iniには対応するデータベース構成オプションがあります.
新しいdbコントローラを再構築するには:
smallfish@debian:~/workspace/python$ cd hellodb/
smallfish@debian:~/workspace/python/hellodb$ paster controller db
Creating /home/smallfish/workspace/python/hellodb/hellodb/controllers/db.py
Creating /home/smallfish/workspace/python/hellodb/hellodb/tests/functional/test_db.py
developmentを編集します.ini、データベース構成セクションを追加します.smallfish:123456は対応するPostgreSQLユーザー名/パスワード、127.0.0.1:5432は対応するホストアドレス/ポート番号、最後のtestはデータベース名です.
# SQLAlchemy database URL
sqlalchemy.url = postgresql://smallfish:[email protected]:5432/test
hellodb/model/_の編集init__.py、msgというテーブルとフィールドの定義を追加します.
"""The application's model objects"""
from hellodb.model.meta import Session, metadata
from sqlalchemy import orm, schema, types
from datetime import datetime
def init_model(engine):
"""Call me before using any of the tables or classes in the model"""
Session.configure(bind=engine)
def now():
return datetime.now()
msg_table = schema.Table('msg', metadata,
schema.Column('id', types.Integer, schema.Sequence('msg_seq_id', optional=True), primary_key=True),
schema.Column('content', types.Text(), nullable=False),
schema.Column('addtime', types.DateTime(), default=now),
)
class Msg(object):
pass
orm.mapper(Msg, msg_table)
例Msgテーブルは簡単で、ID、コンテンツ、時間の3つのフィールドがあります.
上のコードはsqlchemyパッケージにインポートされたいくつかのライブラリを除いて、基本的に対応するテーブルのフィールド定義があり、空のMsgオブジェクトもあります.
最後の行は、mapの動作をして、Msgをmsg_にマッピングします.table上.
次はデータベースに対応するテーブルを作成しますか?データベースを初期化する簡単な方法があります:paster setup-app development.ini:
smallfish@debian:~/workspace/python/hellodb$ paster setup-app development.ini
Running setup_config() from hellodb.websetup
20:08:43,619 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] select version()
20:08:43,619 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] {}
20:08:43,625 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] select current_schema()
20:08:43,625 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] {}
20:08:43,631 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where n.nspname=current_schema() and lower(relname)=%(name)s
20:08:43,631 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] {'name': u'msg'}
20:08:43,637 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread]
CREATE TABLE msg (
id SERIAL NOT NULL,
content TEXT NOT NULL,
addtime TIMESTAMP WITHOUT TIME ZONE,
PRIMARY KEY (id)
)
20:08:43,637 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] {}
20:08:43,732 INFO [sqlalchemy.engine.base.Engine.0x...854c] [MainThread] COMMIT
表を作成するSQL文を含む上の出力ログが表示されます.ここでSERIALは上に対応するinit__.pyにおけるColumnのSeq定義.serialタイプはPostgreSQLでMySQLのような自増ID(auto_increment)と見なすことができる.
PostgreSQLクエリー・データベースにアクセスすると、テーブルとシーケンスが確立されていることがわかります.
test=# /d
| | |
----------+------------+--------+-----------
public | msg | | smallfish
public | msg_id_seq | | smallfish
(2 )
ここでは、データベースの初期化、プロファイル、コントローラの例など、準備が完了しました.
次にcontrollerコードにデータベースの読み書き機能を追加しましょう.
まずフォームテンプレートdbを作成する.htm、データベース・テーブルに追加および保存するために使用される:
<form action="/db/add" method="post">
<input type="text" name="content" />
<br />
<input type="submit" value="save" />
</form>
コントロールindexに対応して、簡単に変更できます.テンプレートに戻る:
class DbController(BaseController):
def index(self):
return render('/db.htm')
上のformの/db/addパスに対応するaddメソッドを追加します.
def add(self):
content = request.POST['content']
from hellodb import model
msg = model.Msg()
msg.content = content
model.meta.Session.add(msg)
model.meta.Session.commit()
return "add %s ok..." % content
部分を追加するのは簡単です.POSTテキストボックスを取得し、Msgオブジェクト(上のモデルで定義されている)を初期化します.
add以降は、データベースに本当に保存されるように手動でcommitする必要があります.
ブラウザにアクセスしてください:http://127.0.0.1:5000/db/indexああ、勝手にデータを追加しましょう.この時、PostgreSQLでデータが追加されたことを検索することができます.
次にindexメソッドでテンプレートに値を渡し、さっき追加したデータを出力します.
def index(self):
from hellodb import model
c.msgs = model.meta.Session.query(model.Msg).all()
return render('/db.htm')
c.msgsはグローバル変数として理解でき,cに関する定義はcontrollerの数行前に見られるはずである.テンプレートdbを変更します.htm表示レコード:
% for msg in c.msgs:
<p>${msg.id}: ${msg.content} / ${msg.addtime}</p>
% endfor
簡単で、ただ1つの普通のfor循環で、index方式の中で伝達するc.msgsを遍歴します.Makoテンプレートはやはり読みやすいですよね?
次の更新を続行します.http://127.0.0.1:5000/db/indexあ、追加したデータがページに表示されます.
何十本も入力した後、1ページにテトガメではないかと表示されます.
次はPylonsのwebhelperのページコンポーネントの使い方を紹介します.もちろん、自分でページアルゴリズムを書くこともできます.次に例を示します.
def list(self):
from webhelpers import paginate
from hellodb import model
msgs = model.meta.Session.query(model.Msg)
c.paginator = paginate.Page(
msgs,
page=int(request.params.get('page', 1)),
items_per_page = 10,
)
return render("/list.htm")
paginateをインポートし、クエリーのデータベースオブジェクトをパラメータとしてpaginateに渡す.Page、中のpageはページの伝達ページ数パラメータ、items_per_pageはよく理解できますが、何枚か1ページです.ここは10本です.
対応するテンプレートlist.htmは以下の通りです.
<pre>
% if len(c.paginator):
% for msg in c.paginator:
<p>${msg.id}: ${msg.content}</p>
% endfor
<p> ${c.paginator.pager("count: $item_count $first_item to $last_item , $link_first $link_previous $link_next $link_last")} </p>
% endif
forセクションは上記の例のように、次にpagerの行を追加します.中にはいくつかの変数が名前から機能を見ることができます.合計エントリ数、現在は何番目から何番目、次によく使用されるトップページ、前ページ、下ページ、最後のページが含まれます.
ここにリンクされている文字はすべて<,<,>>>.文字に変更したい場合は、ドキュメントを参照してください.最初のページであれば、最初のページと前のページは表示されません.このページングをした人は一般的に似たようなコードを書いたことがあるでしょう.
次にアクセスします.http://127.0.0.1:5000/db/listああ、効果を見たいなら、もちろんもっとデータを記入しなければなりませんよ.10個でページ分割の掘削が表示されます.
はい、ここではデータベースの追加と表示部分にサンプルコードがあります.もちろん、最後にページングの使い方があります.削除や更新などはSQLAlchemyドキュメントを参照してください.
http://chenxiaoyu.org/blog/archives/312