gpt4 book ai didi

python - Python 或 Bash 或 CLI 中的 SQLite 数据更改通知回调

转载 作者:IT王子 更新时间:2023-10-29 06:22:23 25 4
gpt4 key购买 nike

SQLite 有 Data Change Notification Callbacks在 C API 中可用。可以从 SQLite CLI、Bash 或 Python 使用这些回调吗?

如果是,怎么做到的?

最佳答案

Can these callbacks be used from the SQLite CLI...

通读 SQLite 源代码,在 CLI 源代码的任何地方似乎都没有使用该函数,所以我怀疑您是否可以通过 CLI 完成它。

...or from Bash...

不确定你的意思。

...or from Python?

它没有通过标准公开 sqlite3模块,但您可以将其与 ctypes 一起使用模块。

If so, how?

这是一个通过 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, 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"

...第二次运行。

关于python - Python 或 Bash 或 CLI 中的 SQLite 数据更改通知回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16872700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com