2017-07-17 3 views
0

Hallo, ich habe derzeit ein Datenbankmodell, das db.event.listens_for() als Auslöser verwendet.Wie mehrere Methoden nach db.event.listens_for ausgeführt werden (MODELL, "nach _....")

beispiel

@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) 

ist es eine Möglichkeit, zu einer Gruppe zusammen mehr Methoden und mit nur einer Verwendung der Überzugseinrichtung einen Batch-Betrieb durchführen?

Eine Klasse vielleicht?

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

    def DOB(self): 
     #do stuff 
+0

Warum schreibst du nicht einfach eine Funktion, die die anderen Funktionen aufruft und das dekorieren? –

+0

das könnte funktionieren. Aber gibt es einen Weg, es durch eine Klasse zu implementieren? –

+0

Sorry, ich weiß es nicht. Ich habe SQLAlchemy in ein paar Jahren nicht benutzt, deshalb habe ich nur einen Kommentar abgegeben. –

Antwort

1

Könnten Sie versuchen, etwas wie folgt aus:

@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 

Dies ist im Wesentlichen die gleiche wie mein Vorschlag, eine Funktion zu machen, die die Funktionen aufruft, aber Sie können Gruppe alle Methoden zusammen auf diese Weise.

+0

Wie würde das aussehen mit den Dekorateuren und einer einfachen Methode? –

+0

Ich bearbeitet, um ein bisschen mehr zu sehen, wie ich dachte. Da ich Flask nicht eingerichtet habe, kann ich es selbst nicht testen, aber ich gehe davon aus, dass die 'listens_for'-Funktion die Klasse genauso wie bei einer Funktion aufruft und die Argumente an den Initialisierer übergibt Sie könnten auf die Argumente genauso zugreifen wie von einer Funktion, aber innerhalb der Methode "__init__". –

+0

es funktioniert nicht. Es gibt den Fehler. 'super (AfterDeleteListener, selbst) .__ init __ (* args, ** kwargs) TypeError: Objekt .__ init __() braucht keine Parameter' –

Verwandte Themen