SQLAlchemy Mixins /和事件监听器
我正在同时尝试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
在这一点上,我很沮丧。
-
这是我要侦听
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)
这样,您可以:
- 轻松扩展和更改您的收听内容和注册内容。
- 覆盖某些类的create_time方法
- 明确说明哪些方法需要设置其时间戳。
您可以简单地使用它:
class MyMappedClass(TimeStampMixin, Base): pass MyMappedClass.register()
简单,非常清晰,没有魔力,但仍然可以根据您的需要进行封装。
-
删除匿名事件监听器
2021-02-02 关注 0 浏览65 1答案
-
Zookeeper Watcher(事件监听器)?
2020-11-26 关注 0 浏览714 1答案
-
什么是被动事件监听器?
2021-02-02 关注 0 浏览181 1答案
-
什么是被动事件监听器?
2022-05-26 关注 0 浏览17 1答案
-
下列事件监听器中,无法对TextField对象进行事件监听和处理的是( )。
2022-05-11 关注 0 浏览10 1答案
-
下列事件监听器中,无法对TextField对象进行事件监听和处理的是( )。
2022-05-11 关注 0 浏览16 1答案
-
AngularJS - $destroy 是否删除事件监听器?
2022-07-28 关注 0 浏览15 1答案
-
休眠中的PreInsert和PreUpdate事件监听器
2021-02-01 关注 0 浏览106 1答案
-
Android自定义事件监听器
2021-01-29 关注 0 浏览805 1答案
-
JavaScript自定义事件监听器
2021-02-02 关注 0 浏览97 1答案