Pylons入門インスタンスチュートリアル–データベース操作

8630 ワード

前の2編の入門では、Pylonsが大まかに開発したプロセス、フォーム、ファイルのアップロードについて述べています.構想は伝統的な開発とほぼ似ています.この記事では、Pylonsでデータベースをどのように使用するかについて簡単に説明します.
本編では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