import datetime
import time
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy import event
from sqlalchemy.orm import Query
from sqlalchemy.orm import declarative_mixin
Base = declarative_base()
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
data = Column(String)
create_time = Column(DateTime)
update_time = Column(DateTime)
session_engine = create_engine("sqlite://", echo=True)
Base.metadata.create_all(session_engine)
@event.listens_for(Query, "before_compile")
def _before_compile(query):
query.session.connection().info['my_option'] = True
'''
conn → SQLAlchemy 的 Connection 对象
cursor → DBAPI 的游标对象(例如 sqlite3 的 Cursor)
statement → 即将执行的 SQL 语句(字符串)
parameters → SQL 的绑定参数
context → 执行上下文对象(包含执行的各种信息)
executemany → 是否是批量执行
'''
@event.listens_for(session_engine, "before_cursor_execute")
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
context._query_start_time = time.time()
print("开始执行:", statement)
@event.listens_for(session_engine, "after_cursor_execute")
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
total = time.time() - context._query_start_time
print("执行完成,总耗时: %.5f 秒" % total)
# 拦截器,设置属性
@event.listens_for(A, "before_insert")
def set_create_time(mapper, connection, target):
if hasattr(target,'create_time'): # 仅在为空时设置
target.create_time = datetime.datetime.now()
# 拦截器,设置属性
@event.listens_for(A, "before_update")
def set_update_time(mapper, connection, target):
if hasattr(target,'update_time'): # 仅在为空时设置
target.update_time = datetime.datetime.now()
s = Session(session_engine)
s.add_all([A(data='a'), A(data='b')])
s.commit()
for item in s.query(A).all():
print(item.__dict__)
python sqlalchemy 拦截器更新字段
最新推荐文章于 2025-09-03 11:20:21 发布