【问题标题】:Pylons: Sharing SQLAlchemy MySQL connection with external libraryPylons:与外部库共享 SQLAlchemy MySQL 连接
【发布时间】:2011-05-02 03:44:16
【问题描述】:

我正在使用 SQLAlchemy 运行 Pylons 以连接到 MySQL,所以当我想在控制器中使用数据库连接时,我可以这样做:

from myapp.model.meta import Session

class SomeController(BaseController):
    def index(self):
        conn = Session.connection()
        rows = conn.execute('SELECT whatever')
...

假设我的控制器需要调用一个外部库,这也需要一个数据库连接,我想从已经建立的 SQLAlchemy MySQL 连接中为其提供连接:

from myapp.model.meta import Session

import mymodule

class SomeController(BaseController):
    def index(self):
        conn = Session.connection()
        myobject = mymodule.someobject(DATABASE_OBJECT)
        ...
        conn.close()

DATABSE_OBJECT 应该是什么?可能性:

  1. 传递Session -- 然后在模块代码中打开和关闭Session.connection()
  2. 传递conn,然后在控制器中调用conn.close()
  3. 只需传递连接参数,让模块代码建立自己的连接

还有一个问题,就是我需要实例化app_globals.py中的一些对象,而这些对象也需要数据库连接。看来app_globals.py 还不能使用Session 的SQLAlchemy 连接——它还没有绑定。

我的架构从根本上是不健全的吗?我不应该尝试以这种方式在 Pylons 和外部库之间共享连接吗?谢谢!

【问题讨论】:

    标签: python mysql sqlalchemy pylons


    【解决方案1】:

    您不应该自己管理连接 - 这一切都由 SQLAlchemy 完成。只需在任何地方使用作用域会话对象,就可以了。

    def init_model(engine):
        sm = orm.sessionmaker(autoflush=False, autocommit=False, expire_on_commit=False, bind=engine)
        meta.engine = engine
        meta.Session = orm.scoped_session(sm)
    
    def index(self):
        rows = Session.execute('SELECT ...')
    

    您可以将 Session 对象传递给您的外部库,并根据需要在那里进行查询。无需调用 .close() 。

    关于 app_globals,我通过在 globals 类中添加其他方法解决了这个问题,该方法是在 environment.py 的 db 初始化之后调用的

    class Globals(...):
        def init_model(self, config):
            self.some_persistent_db_object = Session.execute('...')
    
    def load_environment(...):
        ...
        config['pylons.app_globals'].init_model(config)
        return config
    

    【讨论】:

    • 很好的信息,非常感谢。我喜欢 load_environment 方法,这将是完美的。非常感谢!
    【解决方案2】:
    DATABSE_OBJECT 应该是什么?可能性:

    4。传递具有更高抽象接口级别的“代理”或“帮助”对象

    除非外部库确实需要直接访问 SQLAlchemy 会话,否则您可以为其提供具有“get_account(account_no)”等方法的对象,而不是“execute(sql)”。这样做会使特定于 SQLAlchemy 的代码更加隔离,并且代码也更容易测试。

    很抱歉,这与其说是对您最初问题的回答,不如说是一个设计建议。

    【讨论】:

    • 谢谢 Pēteris,这通常是个好主意。在我的例子中,外部库与我的 Pylons 应用程序是分离的,它希望通过正常的数据库连接来工作,因此为它提供所有数据库交互的方法将是太多的重复。不过在某些情况下,这将是一个不错的架构解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2016-01-02
    • 1970-01-01
    • 2023-04-01
    • 2016-05-30
    • 2023-03-03
    • 2011-02-08
    相关资源
    最近更新 更多