python - association_proxy 创建者中的 session

标签 python sqlalchemy

我使用 SQLAlchemy 0.5 和 Python 2.6.6。

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

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

我试过的,没用

我找到了 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)

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

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

最佳答案

我想你需要的是一个验证方法:

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 .

关于python - association_proxy 创建者中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153474/

相关文章:

insert - sqlalchemy 的 MapperExtension 的一些问题

python - 如何在 sqlalchemy ORM 中进行批量更新

sqlalchemy - 给定一个声明性 SQLAlchemy 类,我如何以编程方式检索其作为主键的 Column 对象的列表?

SQLAlchemy:如何在 session.close() 之后在 SQLAlchemy 中使用实例?

python - 您如何为 WTForms-Alchemy 指定 unique=True?

python - 加入两个时间线/元组列表

python - Django 呈现模板 `500.html` 而不是 `404.html`

python - spark-submit 和 pyspark 有什么区别?

python - Cloud Run 上的 Django 应用无限重定向 (301)

python - 在 Python 中保存和加载大型字典的最快方法