Python 关联中的会话\u代理创建者
我使用SQLAlchemy 0.5和Python 2.6.6 我想在关联代理的创建者中选择或创建引用对象。我的问题是,我需要一个会话来完成这个任务,但我不知道在creator回调中从哪里获取这个任务 如何在关联代理的创建者之一中使用对象所属的会话 我尝试过的,但不起作用 我找到了Python 关联中的会话\u代理创建者,python,sqlalchemy,Python,Sqlalchemy,我使用SQLAlchemy 0.5和Python 2.6.6 我想在关联代理的创建者中选择或创建引用对象。我的问题是,我需要一个会话来完成这个任务,但我不知道在creator回调中从哪里获取这个任务 如何在关联代理的创建者之一中使用对象所属的会话 我尝试过的,但不起作用 我找到了session.object\u session,但回调中没有任何对象,除非它是我的ORM对象的一部分。如果它是我的对象的一部分,调用方将不会作为方法调用(第一个参数是代理的值,而不是对象的引用): 我可以将对象本身传递
session.object\u session
,但回调中没有任何对象,除非它是我的ORM对象的一部分。如果它是我的对象的一部分,调用方将不会作为方法调用(第一个参数是代理的值,而不是对象的引用):
我可以将对象本身传递给创建者函数吗?在这种情况下,我可以在这个对象上调用object_会话
我的项目使用了几个会话,因此我必须确定创建者执行时的具体会话。这个问题在SQLAlchemy 0.7中也存在。我在一个稍微不同的环境中遇到了同样的问题。因为associationproxy是一个Python描述符,描述符在类级别上运行,所以不能给creator函数一个对绑定方法的引用(绑定方法在实例级别上运行) 我得出了以下解决方案:
def find_object(name):
# Because we can't get a grip on the actual session we instead use a global
# session for querying this instance.
session = Session()
obj = Model.query(session).filter_by(name=name).first()
# We also have to dump the reference to that session, so the created object
# can be used on other sessions.
session.expunge(obj)
# We don't need that session any more.
session.close()
return obj
我认为您需要的是验证方法:
from sqlalchemy.orm import validates, object_session
class Event(ManagerBase):
value = relationship(FieldValue)
fields = association_proxy("field_values", "value",
creator=lambda group: FieldValue(value=value))
@validates("field_values")
def _validate_field_values(self, key, value):
session = object_session(self)
if session is not None:
v = value.value
with session.no_autoflush:
uvalue = session.query(FieldValue) \
.filter_by(name=a) \
.first()
if uvalue:
session.expunge(value)
return ugroup
return value
积分归为。如果您以异步方式编程(例如Tornado),也会出现这种情况。在Tornado中,会话永远不能是全局的,以免事务被不同的处理程序混淆。@v=value.value@的目的是什么?
from sqlalchemy.orm import validates, object_session
class Event(ManagerBase):
value = relationship(FieldValue)
fields = association_proxy("field_values", "value",
creator=lambda group: FieldValue(value=value))
@validates("field_values")
def _validate_field_values(self, key, value):
session = object_session(self)
if session is not None:
v = value.value
with session.no_autoflush:
uvalue = session.query(FieldValue) \
.filter_by(name=a) \
.first()
if uvalue:
session.expunge(value)
return ugroup
return value