【问题标题】:Database Connection Manager for Pyramid using minimal SQLAlchemy使用最少的 SQLAlchemy 的 Pyramid 数据库连接管理器
【发布时间】:2014-09-03 09:44:03
【问题描述】:

我在 Pyramid 中创建了一个 starter (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)

【问题讨论】:

    标签: python-2.7 sqlalchemy database-connection pyramid


    【解决方案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
    

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

    【讨论】:

    • 您能描述一下我应该如何创建会话对象。由于会话对象不需要跟踪模型对象中所做的更改(因为我没有创建任何对象),使用它的最佳方法是什么?应该我使用 DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))。
    【解决方案2】:

    你可以使用 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()函数关闭连接。

    这样dababase连接只有在你使用request.db时才会被初始化,当a连接被初始化时才会关闭。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 2010-09-25
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多