Sqlalchemy 混合/和事件监听器 [英] Sqlalchemy mixins / and event listener
问题描述
我正在同时尝试 2 件新事物,因此感谢您在简化和澄清方面的帮助.
I am attempting 2 new things at once, so assistance in both simplifying and clarifying is appreciated.
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:
So I want to create a mixin I can apply in any class:
class MyClass(TimeStampMixin, Base):
etc, etc, etc
该类继承了在创建时创建时间戳和在更新时创建/修改时间戳的功能.
This class inherits functionality that creates a timestamp on creation and creates/modifies a timestamp on update.
导入时出现此错误:
raise exc.UnmappedClassError(class_)
sqlalchemy.orm.exc.UnmappedClassError: Class 'db.database.TimeStampMixin' is not mapped
aaa我在这一点上难住了.
aaaand I'm stumped at this point.
推荐答案
以下是我为侦听 before_insert
事件所做的操作:将 classmethod
添加到您的 TimeStampMixin
注册当前类并处理设置创建时间.
Here's what I'd do to listen on before_insert
events: add a classmethod
to your TimeStampMixin
that registers the current class and handles setting creation time.
例如
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()
简单,非常清晰,没有魔法,但仍然可以像您想要的那样封装.
Simple, very clear, no magic, but still encapsulates like you want.
这篇关于Sqlalchemy 混合/和事件监听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!