挂入sqlalchemy模型

blu*_*ank 8 python orm hook sqlalchemy

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

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

sqlalchemy中是否有基于某些提示的模型/实例做事的类似设施,例如after_create?

Vin*_*cer 18

一旦掌握了它,事件就非常简单.这是一个使用事件的快速示例

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)
Run Code Online (Sandbox Code Playgroud)

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

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

@listens_for(User, 'before_insert')
def generate_license(mapper, connect, self):
    …
Run Code Online (Sandbox Code Playgroud)


mas*_*ier 8

from sqlalchemy.event import listen_for
…
class User(Base):
…
    @listen_for(User, 'before_insert')
    @staticmethod
    def generate_license(mapper, connect, self):
…
Run Code Online (Sandbox Code Playgroud)

这将返回

NameError: name 'User' is not defined
Run Code Online (Sandbox Code Playgroud)