Pylons:与外部库共享SQLAlchemy MySQL连接

时间:2010-10-28 22:44:49

标签: python mysql sqlalchemy pylons

我使用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. 只需传递连接参数,并让模块代码设置自己的连接
  4. 还有另一个问题,就是我需要在app_globals.py中实例化一些对象,这些对象也需要数据库连接。似乎app_globals.py无法使用Session的SQLAlchemy连接 - 它还没有绑定。

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

2 个答案:

答案 0 :(得分:2)

您不应该自己管理连接 - 这些都是由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中调用的。

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

答案 1 :(得分:1)

DATABSE_OBJECT应该是什么?可能性:

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

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

很抱歉,这不是对原始问题的回答,更多是设计建议。