在 SQLAlchemy 中使用事件监听器

2023-04-05 00:00:00 sqlalchemy 事件 监听器

SQLAlchemy 中提供了多种事件监听器,包括监听表格、模型类、连接、事务等事件。通过监听这些事件,我们可以实现许多强大的功能,例如记录日志、自动填充时间戳、增强数据验证等。
下面以监听模型类事件为例,演示如何使用事件监听器。
首先定义一个模型类:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(50))

然后定义一个监听器:

from sqlalchemy import event
@event.listens_for(User, 'before_insert')
def before_insert_listener(mapper, connection, target):
    # 在插入数据前自动填充时间戳
    target.created_at = datetime.now()
    target.updated_at = datetime.now()

在这个监听器中,我们监听了 User 模型类的 before_insert 事件,并在事件发生时进行自定义的操作。在这个例子中,我们为 created_at 和 updated_at 字段自动填充当前时间戳。
最后使用 SQLAlchemy 进行数据库操作时,事件就会被触发:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///test.db')
Session = sessionmaker(bind=engine)
session = Session()
user = User(name='pidancode.com', email='hello@pidancode.com')
session.add(user)
session.commit()
print(user.created_at)  # 输出插入数据时的时间戳

输出结果为:

2021-11-11 11:11:11.111111

通过监听器,我们成功实现了在插入数据前自动填充时间戳的功能。
需要注意的是,使用事件监听器时要注意不要过度使用,否则可能会导致代码难以维护和理解。只有在确实需要在模型类事件发生时执行自定义操作时才应该使用事件监听器。

相关文章