cha*_*787 2 python orm session events 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"})
Run Code Online (Sandbox Code Playgroud)
每件事都运行正常,但我有一些更新方法使用sqlalchemy的许多字段.
已更新,但不会同时触发打印功能.
所以我想知道,这是注册事件或错误方式进行更新的错误方法吗?
要在使用query.update()方法时接收事件,您需要使用after_bulk_update事件.由于此操作不处理单个对象而是直接发出UPDATE语句,因此内存中可能受影响的实际对象不在本地可用; 您可能需要查询它们.matched_objects如果"synchronize_session"设置为"evaluate",则上下文将具有属性.
| 归档时间: |
|
| 查看次数: |
2169 次 |
| 最近记录: |