挂钩到 sqlalchemy 模型

Posted

技术标签:

【中文标题】挂钩到 sqlalchemy 模型【英文标题】:Hooking into sqlalchemy models 【发布时间】:2012-09-20 12:34:17 【问题描述】:

我希望加入 sqlalchemy 模型的模型创建周期。例如在创建或保存时(如在 Ruby ORM ActiveRecord 中,实际上我正在将模型从 ActiveRecord 移动到 SqlAlchemy)。

事件看起来像我需要的:http://docs.sqlalchemy.org/en/rel_0_7/core/event.html,但我还没有找到更详细的示例。我想听听有人对此的经验。

sqlalchemy 中是否有类似的工具可以根据某些线索使用模型/实例来做事,例如after_create?

【问题讨论】:

【参考方案1】:

一旦掌握了窍门,事件就会变得非常简单。 这是一个使用事件的简单示例

import uuid    

from sqlalchemy.event import listen

from mypackage.models import Base


def generate_license(mapper, connect, target):
    target.generate_license()

class User(Base):
    __tablename__ = "users"
    id = Column(String(36))
    license = Column(String(256))

    def generate_license(self):
        if not self.license:
            self.license = str(uuid.uuid4())
        return self.license

listen(User, 'before_insert', generate_license)

或者,您可以使用装饰器:

from sqlalchemy.event import listens_for
…
class User(Base):
    …

@listens_for(User, 'before_insert')
def generate_license(mapper, connect, self):
    …

【讨论】:

【参考方案2】:
from sqlalchemy.event import listen_for
…
class User(Base):
…
    @listen_for(User, 'before_insert')
    @staticmethod
    def generate_license(mapper, connect, self):
…

这将返回

NameError: name 'User' is not defined

【讨论】:

以上是关于挂钩到 sqlalchemy 模型的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy模型中的进程字段(使用flask_sqlalchemy)

sqlalchemy 简单使用

SQLAlchemy-ORM

通过用户模型,对数据库进行增删改查操作

初学flask_sqlalchemy

使用 sqlalchemy 实现“软删除”系统