0

データベースに接続するWebアプリケーションを作成しています。現在、他のモジュールからインポートしたモジュールで変数を使用していますが、これは厄介な感じがします。

# server.py
from hexapoda.application import application

if __name__ == '__main__':
  from paste import httpserver
  httpserver.serve(application, host='127.0.0.1', port='1337')

# hexapoda/application.py
from mongoalchemy.session import Session
db = Session.connect('hexapoda')

import hexapoda.tickets.controllers

# hexapoda/tickets/controllers.py
from hexapoda.application import db

def index(request, params):
  tickets = db.query(Ticket)

application.py問題は、データベースへの複数の接続を取得することです( 2つの異なるモジュールにインポートするため、Session.connect()関数が2回実行されると思います)。

複数の接続を作成せずに(つまり、アプリケーション全体で1回dbだけ呼び出す)、複数のモジュールからアクセスするにはどうすればよいですか?Session.connect()

4

2 に答える 2

1

次のようなツイストフレームワークを試してください。

from twisted.enterprise import adbapi

class db(object):

    def __init__(self):
        self.dbpool = adbapi.ConnectionPool('MySQLdb',
            db='database',
            user='username',
            passwd='password')

    def query(self, sql)
        self.dbpool.runInteraction(self._query, sql)

    def _query(self, tx, sql):
        tx.execute(sql)
        print tx.fetchone()
于 2012-06-18T16:47:31.907 に答える
0

それはおそらくあなたがやりたいことではありません-アプリごとに単一の接続は、アプリがスケーリングできないことを意味します。

通常の解決策は、リクエストが着信したときにデータベースに接続し、その接続を「リクエスト」スコープを持つ変数に格納することです(つまり、リクエストが存在する限り存続します)。

requestそれを達成する簡単な方法は、それを:に入れることです。

request.db = ...connect...

Webフレームワークは、メソッドまたはすべてのリクエストを表示するフィルターのようなものに注釈を付ける方法を提供している可能性があります。そこに接続を開閉するコードを入れてください。

接続を開くのに費用がかかる場合は、接続プールを使用してください。

于 2012-06-18T16:05:09.157 に答える