2017-07-17 204 views
0

您好,我目前有一个使用db.event.listens_for()作为触发器的数据库模型。如何在db.event.listens_for(MODEL,“_....”之后)运行多个方法

例如

@db.event.listens_for(Order, "after_delete") 
def update_table_status(mapper, connection, target): 
    # print('Checking if the table contains orders') 
    table = Tables.__table__ 
    orders = Order.query.filter_by(tables_id=target.tables_id).filter(Order.checkout_id == None).all() 
    # print(orders) 
    # print(target.tables_id) 
    if len(orders) == 0: 
     # print('No orders associated to the table.') 
     connection.execute(table.update().where(table.c.id == target.tables_id).values(active=0)) 
     # firebase_table(target.store_id) 
    else: 
     # print('Orders still associated to the table.') 
     connection.execute(table.update().where(table.c.id == target.tables_id).values(active=1)) 
     # firebase_table(target.store_id) 

是有办法组在一起的多个方法和仅具有一个使用该装饰的执行间歇操作?

一个类可能吗?

@db.event.listens_for(Order, "after_delete") 
class OrdersAfterDelete: 
    def DOA(self): 
     #do stuff 

    def DOB(self): 
     #do stuff 
+0

你为什么不写一个调用其他函数并装饰它的函数? –

+0

可以工作。但是有没有一种方法可以由一个类来实现呢? –

+0

对不起,我不知道。我几年没有使用SQLAlchemy,这就是为什么我只是发表评论。 –

回答

1

你能尝试这样的事:

@db.event.listens_for(Order, "after_delete") 
class AfterDeleteListener(object): 
    def __init__(self, *args, **kwargs): 
     self.DOA(*args, **kwargs) 

    def DOA(self, *args, **kwargs): 
     # do stuff 

这是基本相同,我的建议让调用函数的函数,但是您可以将所有的方法一起使用这种方式。

+0

这将如何与包括装饰和简单的方法? –

+0

我编辑得更像我想的那样。由于我没有设置Flask,所以我无法自己测试它,但是我假设'listens_for'函数将调用类与函数相同,将参数传递给初始值设定项你可以像使用函数一样访问参数,但是可以在__init__方法中使用。 –

+0

它不起作用。它给出了错误。 'super(AfterDeleteListener,self).__ init __(* args,** kwargs) TypeError:object .__ init __()不需要参数' –

相关问题