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

Python 2.7 使用最小SQLAlchemy的金字塔数据库连接管理器,python-2.7,sqlalchemy,database-connection,pyramid,Python 2.7,Sqlalchemy,Database Connection,Pyramid,我在金字塔里做了一个初学者pcreate-s初学者我的项目。 如何在需要时使数据库连接可用于我的应用程序 我看了这里: 代码如下: @subscriber(NewRequest) def new_request_subscriber(event): request = event.request settings = request.registry.settings request.db = sqlite3.connect(settings['db']) req

我在金字塔里做了一个初学者pcreate-s初学者我的项目。 如何在需要时使数据库连接可用于我的应用程序

我看了这里:

代码如下:

@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()
我担心性能,因为无论我们是否使用它,它都会为每个请求建立数据库连接

它是好的还是我应该用其他的方法来做呢?我怎样才能用最简单的方法来使用sqlalchemyin,可能是10到15行代码并使它变得更好


注意:我不想使用sqlalchemy或MDEEP学习曲线。因此,我避免了pcreate-s alchemy MyProject

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.py中MyModel的定义和views.py中的示例视图。

您可以使用config.add\u request\u方法来执行您需要的操作:

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_回调将调用db_close函数来关闭连接


这样,只有在使用request.db时,才会初始化DABASE连接,当一个连接被初始化时,它将被关闭。

你能描述一下我应该如何创建一个会话对象吗。由于会话对象不需要跟踪模型对象中所做的更改,因为我没有创建任何模型对象,所以使用它的最佳方法是什么?我应该使用DBSession=scoped\u sessionsessionmakerextension=ZopeTransactionExtension吗。