【问题标题】:Hooking into sqlalchemy models挂钩到 sqlalchemy 模型
【发布时间】: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?

【问题讨论】:

    标签: python orm sqlalchemy hook


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2015-10-16
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多