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

发布于 2021-01-29 17:02:39

SQLite在CAPI中提供了数据更改通知回调。可以在SQLiteCLI,Bash或Python中使用这些回调吗?

如果是这样,怎么办?

关注者
0
被浏览
34
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    可以从SQLite CLI使用这些回调…

    仔细阅读SQLite源代码,看起来该功能似乎未在CLI源代码中的任何地方使用,因此我怀疑您可以通过CLI来完成此工作。

    …或者来自Bash …

    不知道那是什么意思。

    …或来自Python?

    它不是通过标准sqlite3模块公开的,但是可以与ctypes模块一起使用。

    如果是这样,怎么办?

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

    在第二轮



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看