python sqlalchemy 拦截器更新字段

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__)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值