2017-08-10 2 views
0

Ich verwende die set_update_hook() Funktion im Python-Modul karellen-sqlite, um Datenbankänderungen automatisch an eine Funktion zu senden. Grundsätzlich funktioniert es wie folgt aus:Daten in Hook einschließen?

from pysqlite2 import connect 

def hook(conn, op, db_name, table_name, rowid): 
    """Handle notification here. Do not modify the connection!""" 

with connect(":memory:") as conn: 
    conn.set_update_hook(hook) 
    conn.execute("CREATE TABLE a (int id);") 
    conn.execute("INSERT INTO a VALUES (1);") 

ich, um zu bestimmen versuche, wenn die Informationen gesendet hook die Daten enthält, die eingeführt wurde, aktualisiert oder in der Datenbank gelöscht.

So, nach einer insert Ausführung gedruckt ich die Werte von hook ‚s Parameter:

conn = ['DataError', 'DatabaseError', 'Error', 'IntegrityError', 'InterfaceError', 'InternalError', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'Warning', '__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_update_hook', '_update_hook_cb', '_update_hook_last_error', 'close', 'commit', 'create_aggregate', 'create_collation', 'create_function', 'cursor', 'enable_load_extension', 'execute', 'executemany', 'executescript', 'in_transaction', 'interrupt', 'isolation_level', 'iterdump', 'last_update_hook_error', 'load_extension', 'rollback', 'row_factory', 'set_authorizer', 'set_progress_handler', 'set_trace_callback', 'set_update_hook', 'text_factory', 'total_changes'] 

op = UpdateHookOps.SQLITE_INSERT 

db_name = main 

table_name = test 

rowid = 3 

Aber wo sind die Daten? Muss ich eine separate Abfrage ausführen, um sie abzurufen (im Falle einer Einfügung oder Aktualisierung)?

Antwort

1

Dieser Mechanismus :) Danke ist ein Wrapper um die sqlite3_update_hook() C API function:

Das erste Argument für den Rückruf zu sqlite3_update_hook() eine Kopie des dritten Arguments. Das zweite Rückrufargument ist einer von SQLITE_INSERT, SQLITE_DELETE oder SQLITE_UPDATE, abhängig von der Operation, die das Aufrufen des Rückrufs verursacht hat. Das dritte und vierte Argument für den Rückruf enthalten Zeiger auf den Datenbank- und Tabellennamen, der die betroffene Zeile enthält. Der letzte Callback-Parameter ist die Zeilennummer der Zeile. Im Falle eines Updates ist dies die Rowid nach dem Update.

So erhalten Sie gerade genug Informationen, um die Zeile zu identifizieren.