假设我的User
模块中有user.py
。我将使用此User
作为更大应用程序的一部分。我将在主应用程序模块中配置Engine
(数据库连接)。但...
如果User.foo
要求使用Engine
或Session
,该怎么办?例如,我在数据库中有一个函数,它接受用户id,我想在foo
内调用该函数。为此,我需要使用Engine.execute
或Session.execute
;但尚未创建Engine
或Session
。
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def foo(self, bar):
"""I need an Engine or Session!"""
pass #....
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
答案 0 :(得分:1)
使用Session
类的object_session
类方法:
def foo(self, bar):
session = Session.object_session(self)
#....
答案 1 :(得分:0)
只要有人调用该方法,您就需要创建一个应用程序级API来检索数据库。
例如,当使用collective.lead
将SQLAlchemy与Zope集成时,数据库作为实用程序在Zope组件体系结构中注册,因此每当我需要会话时,我都使用getUtility查找:
db = getUtility(IDatabase, name=u'responsecentre')
session = db.session
在这种情况下,ZCA getUtility
是用于查找数据库连接的特定于应用程序的API,其中会话绑定到线程。