python - 列更新时的 sqlalchemy 事件

标签 python session events orm sqlalchemy

我在更新 User.name 时注册了一个事件,以便在更新之后或更新之前应用一些规则。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import event
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)   # engine part

Base = declarative_base()


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)
    rule = Column(String)
Base.metadata.create_all(engine)


session = Session()
u1 = User(id=1, name="hello world", fullname="hello kitty")
u2 = User(id=2, name="hello world2", fullname="hello kitty2")
session.add(u1)
session.add(u2)


@event.listens_for(User, 'before_update')
def User_before_update(target, value, initiator):
    print ":::::received before insert event for target"


@event.listens_for(User.name, 'set')
def name_set(target, value, old_value, initiator):
    print ":::::set before insert event for target"


### option A
user = session.query(User).get(2)
user.name = u"wawamsma"
session.merge(user)

### option B
session.query(User).filter(User.id == 2).update({User.name: u"eenimenee"})

选项A

一切正常,但我有一些使用许多字段到 sqlalchemy 的更新方法。

选项B

已更新,但不触发两个打印功能。

所以我想知道,这是注册事件的错误方式还是错误的更新方式?

最佳答案

要在使用 query.update() 方法时接收事件,您需要使用 after_bulk_update事件。由于此操作不处理单个对象,而是直接发出 UPDATE 语句,因此可能在此处受到影响的内存中的实际对象在本地不可用;您可能需要查询它们。如果“synchronize_session”设置为“evaluate”,上下文将具有 matched_objects 属性。

关于python - 列更新时的 sqlalchemy 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152145/

相关文章:

python - Defaultdict/没有足够的值来解压

python - 尝试用 Pandas 生成rolling_sum

database - ZF2 Dafault 数据库 session 存储

asp.net - 我应该使用 ASP.NET session 还是避免使用它们,为什么?

javascript - 如何检测部分填充的 HTML 日期输入

javascript - 单击另一个元素时单击元素

python - 覆盖内置类 (Python)

python - KFold 和 ShuffleSplit CV 有什么区别?

hibernate - hibernate中current_session_context_class属性的可能值和用途

c# - 事件订阅的性能注意事项