我使用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应该是什么?可能性:
Session
- 然后在模块代码中打开和关闭Session.connection()
conn
,然后在控制器中调用conn.close()
还有另一个问题,就是我需要在app_globals.py
中实例化一些对象,这些对象也需要数据库连接。似乎app_globals.py
无法使用Session
的SQLAlchemy连接 - 它还没有绑定。
我的架构是否从根本上不健全?我不应该这样尝试在Pylons和外部库之间共享连接吗?谢谢!
答案 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特定代码更加孤立,代码也更容易测试。
很抱歉,这不是对原始问题的回答,更多是设计建议。