繁体   English   中英

会话在association_proxy创建者中

[英]Session in association_proxy creator

我使用SQLAlchemy 0.5和Python 2.6.6。

我想在association_proxy的创建者中选择或创建一个引用的对象。 我的问题是,为此我需要一个会话,但是我不知道在创建者回调中从何处获取它。

如何在对象的关联代理的创建者之一中使用对象所属的会话?

我尝试过的方法不起作用

我已经找到session.object_session ,但是在回调中没有任何对象,除非它是我的ORM对象的一部分。 如果它是我对象的一部分,则不会将调用方作为方法调用(第一个参数是代理的值,而不是对象的引用):

class Event(ManagerBase):

    # If association_proxy calls this, 'self' is the key, not the
    # reference to the calling instance.
    def _field_find_or_create(self, key, val):
        session = session.object_session(self)
        field = session.query(Field).filter_by(name=key).first()
        if not field:
            field = Field(name=key)

        return EventFieldValue(field=field, value=val)

    fields = association_proxy("field_values", "value",
                               creator=_field_find_or_create)

我可以将对象本身传递给创建者函数吗? 在这种情况下,我可以在该对象上调用object_session。

我的项目使用多个会话,因此,我必须确定创建者执行时的具体会话。

此问题在SQLAlchemy 0.7中也仍然存在。 我在稍有不同的情况下遇到了相同的问题。 因为associationproxy是Python描述符,并且描述符在类级别运行,所以您不能为创建者函数提供对绑定方法的引用(该方法在实例级别运行)。

我得出以下解决方案:

  1. 在您的创建者函数中,从全局会话创建者创建一个新会话并获取您的对象
  2. 从此临时会话中立即清除您获取的对象
  3. 关闭会议
  4. 归还你的物品

我的代码如下所示:

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

学分将转到https://groups.google.com/forum/#!topic/sqlalchemy/RMDI1SnGhd0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM