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在两个不同的模块中导入,所以该Session.connect()函数被执行了两次)。

如何在不创建多个连接的情况下从多个模块访问(即在整个应用程序中db只调用一次)?Session.connect()

4

2 回答 2

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()
于 2012-06-18T16:47:31.907 回答
0

这可能不是您想要做的 - 每个应用程序只有一个连接意味着您的应用程序无法扩展。

通常的解决方案是在请求进入时连接到数据库并将该连接存储在具有“请求”范围的变量中(即它与请求一样长)。

实现这一点的一种简单方法是将其放入request

request.db = ...connect...

您的 Web 框架可能提供了一种方法来注释方法或类似过滤器的东西,它可以查看所有请求。将代码放在那里打开/关闭连接。

如果打开连接很昂贵,请使用连接池。

于 2012-06-18T16:05:09.157 回答