2012-06-18 5 views
0

데이터베이스에 연결하는 웹 응용 프로그램을 작성하고 있습니다. 현재 다른 모듈에서 가져온 모듈에서 변수를 사용하고 있지만 이것은 불쾌하다고 느낍니다. 다른 모듈에서 액세스 할 수있는 파이썬 인스턴스 하나를 만들려면 어떻게해야합니까?

# 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) 

문제

# server.py 
from hexapoda.application import application 

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

은 (내가 두 개의 서로 다른 모듈에 application.py을 가져 오기 때문에 Session.connect() 기능이 두 번 실행됩니다 추측) 나는 데이터베이스에 다중 연결을 얻을 수 있다는 것입니다 .

다중 연결을 만들지 않고 여러 모듈에서 db에 액세스하려면 어떻게해야합니까? (예 : 전체 애플리케이션에서 Session.connect() 만 호출)?

답변

0

아마 당신이 원하는 것은 아닙니다. 앱당 단일 연결은 앱의 확장이 불가능하다는 것을 의미합니다.

일반적인 해결책은 요청이 들어 왔을 때 데이터베이스에 연결하여 해당 요청을 "요청"범위가있는 변수에 저장하는 것입니다 (예 : 요청이 오래 지속되는 경우).

그것을 달성하는 간단한 방법은 request에 넣어하는 것입니다

request.db = ...connect... 

귀하의 웹 프레임 워크는 아마 모든 요청을보고 필터와 같은 방법이나 뭔가를 주석 할 수있는 방법을 제공합니다. 거기에 연결을 열거 나 닫을 코드를 넣으십시오.

여는 연결이 비싼 경우 연결 풀링을 사용하십시오.

+0

, 그러나 나는 이것으로 볼 것이다. –

+0

학습 과제가 아니라면 웹 프레임 워크를 사용해야합니다. 파이썬 웹 애플리케이션의 경우 보통 장고를 권합니다. –

1

는 같은과 Twisted 프레임 워크를 사용해보십시오 : 나는 웹 프레임 워크를 사용하지 않는

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() 
관련 문제