Sqlalchemy 混合/和事件监听器 [英] Sqlalchemy mixins / and event listener

查看:64
本文介绍了Sqlalchemy 混合/和事件监听器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在同时尝试 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)

这样,您可以:

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

您可以简单地使用它:

class MyMappedClass(TimeStampMixin, Base):
    pass

MyMappedClass.register()

简单,非常清晰,没有魔法,但仍然可以像您想要的那样封装.

Simple, very clear, no magic, but still encapsulates like you want.

这篇关于Sqlalchemy 混合/和事件监听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆