SQLite ma Data Change Notification Callbacks dostępne w C API. Czy te wywołania zwrotne mogą być używane z SQLite CLI, lub z Bash lub z Python?Oddzwonienia zwrotne powiadomienia SQLite w Pythonie lub Bash lub CLI
Jeśli tak, w jaki sposób?
SQLite ma Data Change Notification Callbacks dostępne w C API. Czy te wywołania zwrotne mogą być używane z SQLite CLI, lub z Bash lub z Python?Oddzwonienia zwrotne powiadomienia SQLite w Pythonie lub Bash lub CLI
Jeśli tak, w jaki sposób?
Czy te wywołania zwrotne być stosowany z SQLite CLI ...
Czytając kodu źródłowego SQLite, nie wygląda jak ta funkcja jest używana w dowolnym miejscu w kodzie źródłowym CLI, więc wątpliwość możesz to zrobić za pomocą CLI.
... lub Bash ...
Nie wiem, co masz na myśli.
... lub z Python?
To nie jest narażony za pomocą standardowego modułu sqlite3
, ale można go używać z modułem ctypes
.
Jeśli tak, w jaki sposób?
Oto krótki n”brudny przykład użycia go poprzez ctypes
...
from ctypes import *
# Define some symbols
SQLITE_DELETE = 9
SQLITE_INSERT = 18
SQLITE_UPDATE = 23
# Define our callback function
#
# 'user_data' will be the third param passed to sqlite3_update_hook
# 'operation' will be one of: SQLITE_DELETE, SQLITE_INSERT, or SQLITE_UPDATE
# 'db name' will be the name of the affected database
# 'table_name' will be the name of the affected table
# 'row_id' will be the ID of the affected row
def callback(user_data, operation, db_name, table_name, row_id):
if operation == SQLITE_DELETE:
optext = 'Deleted row'
elif operation == SQLITE_INSERT:
optext = 'Inserted row'
elif operation == SQLITE_UPDATE:
optext = 'Updated row'
else:
optext = 'Unknown operation on row'
s = '%s %ld of table "%s" in database "%s"' % (optext, row_id, table_name, db_name)
print s
# Translate into a ctypes callback
c_callback = CFUNCTYPE(c_void_p, c_void_p, c_int, c_char_p, c_char_p, c_int64)(callback)
# Load sqlite3
dll = CDLL('libsqlite3.so')
# Holds a pointer to the database connection
db = c_void_p()
# Open a connection to 'test.db'
dll.sqlite3_open('test.db', byref(db))
# Register callback
dll.sqlite3_update_hook(db, c_callback, None)
# Create a variable to hold error messages
err = c_char_p()
# Now execute some SQL
dll.sqlite3_exec(db, 'create table foo (id int, name varchar(255))', None, None, byref(err))
if err:
print err.value
dll.sqlite3_exec(db, 'insert into foo values (1, "Bob")', None, None, byref(err))
if err:
print err.value
... co wypisuje ...
Inserted row 1 of table "foo" in database "main"
... na pierwszy uruchom i ...
table foo already exists
Inserted row 2 of table "foo" in database "main"
... przy drugim uruchomieniu.
"Nie jestem pewien, co przez to rozumiesz." Mam na myśli, ze skryptu Bash; na przykład jeden, który opakowuje SQLite CLI lub przechwytuje argumenty/opcje przekazane do komendy 'sqlite3'. – sampablokuper
N.B. Twoja linia 'dll = CDLL ('libsqlite3.so')' może na niektórych platformach zostać zmieniona na 'dll = CDLL ('libsqlite3.0.dylib')' – sampablokuper
@ampampokuper Odnośnie komentarza skryptu bash: SQLite CLI doesn Użyj funkcji 'sqlite3_update_hook()' w dowolnym miejscu kodu, więc nie widzę sposobu, w jaki można to zrobić za pomocą skryptu bash, który tylko owija/przechwytuje komendę 'sqlite3'. – Aya
od Go lang ... https://godoc.org/code.google.com/p/go-sqlite/go1/sqlite3#Conn.UpdateFunc – Anentropic
W PyPI apsw ma powiązania: http: // rogerbinns. github.io/apsw/connection.html#apsw.Connection.setupdatehook – GrantJ