使用最小SQLAlchemy的Pyramid数据库连接管理器

时间:2014-07-13 06:41:46

标签: python-2.7 sqlalchemy database-connection pyramid

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

我看了一眼:Subscribing Database Conenction

以下是代码:

@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 orm(深度学习曲线)。因此我避免了(pcreate -s alchemy MyProject)

2 个答案:

答案 0 :(得分:1)

您可以使用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时才会初始化dababase连接,并且在初始化连接时将关闭dababase连接。

答案 1 :(得分:-1)

如果您选择自己做所有事情,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

我将从“炼金术”模板创建的应用程序开始,删除您不会使用的部分。这可能只是MyModelmodels.py的定义和views.py中的示例视图。