Python 关联中的会话\u代理创建者

Python 关联中的会话\u代理创建者,python,sqlalchemy,Python,Sqlalchemy,我使用SQLAlchemy 0.5和Python 2.6.6 我想在关联代理的创建者中选择或创建引用对象。我的问题是,我需要一个会话来完成这个任务,但我不知道在creator回调中从哪里获取这个任务 如何在关联代理的创建者之一中使用对象所属的会话 我尝试过的,但不起作用 我找到了session.object\u session,但回调中没有任何对象,除非它是我的ORM对象的一部分。如果它是我的对象的一部分,调用方将不会作为方法调用(第一个参数是代理的值,而不是对象的引用): 我可以将对象本身传递

我使用SQLAlchemy 0.5和Python 2.6.6

我想在关联代理的创建者中选择或创建引用对象。我的问题是,我需要一个会话来完成这个任务,但我不知道在creator回调中从哪里获取这个任务

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

我尝试过的,但不起作用

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

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


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

这个问题在SQLAlchemy 0.7中也存在。我在一个稍微不同的环境中遇到了同样的问题。因为associationproxy是一个Python描述符,描述符在类级别上运行,所以不能给creator函数一个对绑定方法的引用(绑定方法在实例级别上运行)

我得出了以下解决方案:

  • 在creator函数中,从全局sessionmaker创建一个新会话并获取对象
  • 立即从此临时会话中删除获取的对象
  • 结束会议
  • 归还你的物品
  • 我的代码如下所示:

    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