SQLAlchemy Mixins /和事件监听器

发布于 2021-01-29 15:59:33

我正在同时尝试2种新事物,因此在简化和阐明方面均提供了帮助。

from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy import Column, Float, event

class TimeStampMixin(object):

    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()

    created = Column(Float)
    modified = Column(Float)
    def __init__(self, created = None,
                       modified = None):
        self.created = created
        self.modified = modified

def create_time(mapper, connection, target):
    target.created = time()

#def modified_time(mapper, connection, target):
#    target.modified = time()

event.listen(TimeStampMixin, 'before_insert', create_time)
#event.listen(TimeStampMixin, 'before_update', modified_time)

所以我想创建一个mixin,可以在任何课程中应用:

class MyClass(TimeStampMixin, Base):
    etc, etc, etc

此类继承了在创建时创建时间戳并在更新时创建/修改时间戳的功能。

导入时出现此错误:

raise exc.UnmappedClassError(class_)
sqlalchemy.orm.exc.UnmappedClassError: Class 'db.database.TimeStampMixin' is not mapped

在这一点上,我很沮丧。

关注者
0
被浏览
100
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是我要侦听before_insert事件的方法:classmethod在您的TimeStampMixin上注册当前类并处理设置创建时间。

    例如

    class TimeStampMixin(object):
    
        # other class methods
    
        @staticmethod
        def create_time(mapper, connection, target):
            target.created = time()
    
        @classmethod
        def register(cls):
            sqlalchemy.event.listen(cls, 'before_insert', cls.create_time)
    

    这样,您可以:

    1. 轻松扩展和更改您的收听内容和注册内容。
    2. 覆盖某些类的create_time方法
    3. 明确说明哪些方法需要设置其时间戳。

    您可以简单地使用它:

    class MyMappedClass(TimeStampMixin, Base):
        pass
    
    MyMappedClass.register()
    

    简单,非常清晰,没有魔力,但仍然可以根据您的需要进行封装。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看