簡體   English   中英

SQLAlchemy批量更新查詢失敗,並出現AttributeError

[英]SQLAlchemy bulk update query fails with AttributeError

以下是我擁有的模型和關系配置(不是實際示例)

class MyUser(Base):
    __tablename__ = 'my_user'
    id = Column(Integer, primary_key=True)
    name = Column(String)


class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    my_user = relationship("MyUser", backref="addresses", cascade='save-update, merge')
    _my_user_id = Column('my_user_id', Integer, ForeignKey('my_user.id'), nullable=True)


>>> user = db_session.query(User).get(6)
>>> add = models.Address(email='test2@test2.test2', my_user=user)
>>> db_session.add(add)
>>> db_session.commit()
>>> db_session.query(models.Address).filter_by(my_user=user).update(values=dict(email='test3@test3.test3'))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/query.py", line 3345, in update
        update_op.exec_()
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1178, in exec_
        self._do_pre_synchronize()
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1254, in _do_pre_synchronize
        query.session.identity_map.items()
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1256, in <listcomp>
        eval_condition(obj)]
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/evaluator.py", line 109, in evaluate
        right_val = eval_right(obj)
      File "<hidden>/lib64/python3.6/site-packages/sqlalchemy/orm/evaluator.py", line 65, in <lambda>
        return lambda obj: get_corresponding_attr(obj)
    AttributeError: 'Address' object has no attribute 'my_user_id'

當,

>>> db_session.query(models.Address).filter_by(my_user=user).update(values=dict(email='test3@test3.test3'), synchronize_session=False)
>>> db_session.query(models.Address).filter_by(_my_user_id=user.id).update(values=dict(email='test3@test3.test3'))

即使在會話關閉后仍然有效,

>> db_session.close()
>>> db_session.query(models.Address).filter_by(my_user=user).update(values=dict(email='test3@test3.test3'))

更新查詢有問題嗎? 為什么在其他情況下仍然有效?

這是SQLAlchemy <1.2.x中的問題3366 ,已在1.2.x系列中修復

當主鍵/外鍵列的屬性名稱不存在時, Query.update()Query.delete()使用的“評估”策略現在可以適應從多對一關系到實例的簡單對象比較。與列的實際名稱不匹配。 以前,這會進行簡單的基於名稱的匹配,並失敗並出現AttributeError

最簡單的解決方案是在執行批量操作時升級或避免使用“評估”策略來同步會話

db_session.query(models.Address).\
    filter_by(my_user=user).\
    update(values=dict(email='test3@test3.test3'),
           synchronize_session=False)
# ... or 'fetch'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM