2013-06-01 10 views
7

SQLiteにはC APIで利用可能なData Change Notification Callbacksがあります。これらのコールバックは、SQLite CLIやBashやPythonから使用できますか?SQLiteのデータ変更通知PythonまたはBashまたはCLIによるコールバック

もしそうなら、どうですか? SQLiteのソースコードを読む

+1

Go Lang ... https://godoc.org/code.google.com/p/go-sqlite/go1/sqlite3#Conn.UpdateFunc – Anentropic

+1

PyPIでは、apswにバインディングがあります。http:// rogerbinns。 github.io/apsw/connection.html#apsw.Connection.setupdatehook – GrantJ

答えて

12

これらのコールバックは、SQLiteのCLIから使用することができます...

、それはCLIのソースコードの任意の場所で使用されている機能のように見えるので、私はありませんあなたはCLIを介してそれを行うことができます疑い。

...またはバッシュから...

あなたはそれによって何を意味するかわかりません。

...またはPythonから?

これは、標準sqlite3モジュールを介して露出することはないですが、あなたはctypesモジュールでそれを使用することができます。

もしそうなら、どうすればよいですか?

ここで最初に... ...プリントアウトした...

Inserted row 1 of table "foo" in database "main" 

​​...

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 

を経由して、それを使用しての迅速なn「は汚い例です実行して...

table foo already exists 
Inserted row 2 of table "foo" in database "main" 

... 2回目に実行します。

+1

「あなたはそれが何を意味するかわからない」つまり、Bashスクリプトからです。例えばSQLite CLIをラップするか、 'sqlite3'コマンドに渡される引数/オプションを傍受するものです。 – sampablokuper

+0

N.B. 'dll = CDLL( 'libsqlite3.0.dylib')' – sampablokuper

+1

@sampablokuper bashスクリプトのコメントについて:SQLite CLIは '' dll = CDLL( 'libsqlite3.so'そのコードのどこにでも 'sqlite3_update_hook()'関数を使用していないので、 'sqlite3'コマンドをラップ/インターセプトするbashスクリプトを使ってどのように実行できるのか分かりません。 – Aya

関連する問題