SQLite在 C API 中提供了数据更改通知回调。可以从 SQLite CLI、Bash 或 Python 中使用这些回调吗?
如果是这样,怎么做?
SQLite在 C API 中提供了数据更改通知回调。可以从 SQLite CLI、Bash 或 Python 中使用这些回调吗?
如果是这样,怎么做?
可以从 SQLite CLI 使用这些回调...
通读 SQLite 源代码,看起来该函数在 CLI 源代码中的任何地方都没有使用,所以我怀疑你可以通过 CLI 做到这一点。
...或来自 Bash ...
不知道你的意思是什么。
...还是来自 Python?
它不是通过标准sqlite3
模块公开的,但您可以将它与ctypes
模块一起使用。
如果是这样,怎么做?
这是一个通过ctypes
...使用它的快速n'脏示例
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, b'create table foo (id int, name varchar(255))', None, None, byref(err))
if err:
print(err.value)
dll.sqlite3_exec(db, b'insert into foo values (1, "Bob")', None, None, byref(err))
if err:
print(err.value)
...打印出来...
Inserted row 1 of table "foo" in database "main"
...在第一次运行和...
table foo already exists
Inserted row 2 of table "foo" in database "main"
...在第二次运行。