数据库连接管理器金字塔使用最小的SQLAlchemy



我在Pyramid中创建了一个starter (pcreate -s starter myproject)项目。如何在需要时为应用程序提供数据库连接

我看这里:订阅数据库约定。

代码如下:

@subscriber(NewRequest)
def new_request_subscriber(event):
    request = event.request
    settings = request.registry.settings
    request.db = sqlite3.connect(settings['db'])
    request.add_finished_callback(close_db_connection)
def close_db_connection(request):
    request.db.close()

我很担心性能,因为无论我们是否使用它,它都会为每个请求建立数据库连接。

这样行吗?还是我应该用别的方法?如何使用sqlalchemy(以最小的方式,可能只有10到15行代码)并使其更好?

注意:我不想使用sqlalchemy form(深度学习曲线)。因此我避免了(pcreate -s alchemy MyProject)

您可以使用config.add_request_method()来完成您需要的操作:

def db_connect(request)
    def db_close(request):
        if conn is not None:
            conn.close()
    conn = sqlite3.connect(request.registry.settings['db'])
    request.add_finished_callback(db_close)  
    return conn          
config.add_request_method(db_connect, 'db', reify=True)

这样做的是,当你在代码中使用'request.db'时,它会调用db_connect()函数来获得连接,reify=True意味着它只会调用该函数一次来获得连接。add_finished_callback()将调用db_close()函数来关闭连接。

这样,数据库连接将只在使用request.db时被初始化,并且将在初始化连接时被关闭。

SQLAlchemy解决了很多问题,如果你选择自己做任何事情,你会发现:)像连接池,事务管理,线程本地会话等。

如果您不想使用SQLAlchemy的ORM部分,而希望在任何地方都使用文字SQL(遇到SQL注入时向它问好),那么您可以轻松地执行以下操作:

result = session.execute("""SELECT spam, eggs FROM blah WHERE moo='foo'""")
for row in result:
    print "spam = %s" % row.spam
    print "eggs = %s" % row.eggs

我会从"炼金术"模板创建的应用程序开始,删除你不打算使用的部分。这可能只是models.pyMyModel的定义和views.py中的样例视图。

最新更新