1

我正在尝试使用该Connection.set_authorizer方法仅允许使用连接对象进行某些 DB 操作。(文档在这里

我正在使用此代码进行测试:

import sqlite3 as sqlite

def select_authorizer(sqltype, arg1, arg2, dbname):  
    print("Test")  
    return sqlite.SQLITE_OK  #should allow all operations           

conn = sqlite.connect(":memory:")
conn.execute("CREATE TABLE A (name integer PRIMARY KEY AUTOINCREMENT)")
conn.set_authorizer(select_authorizer)
conn.execute("SELECT * FROM A").fetchall() #should still work

这给了我一个sqlite3.DatabaseError: not authorized,没有打印出“测试”。我猜我可能错误地设置了我的授权人,而且它甚至都没有调用它。(虽然错误消息肯定没有传达)但是根据文档,这个设置看起来是正确的。

编辑:更改sqlite.SQLITE_OKAYsqlite.SQLITE_OK,但由于该方法似乎根本没有被调用,所以这没有帮助也就不足为奇了。

4

2 回答 2

1

授权回调接受5 个参数,但你的只接受 4 个:

回调的第一个参数表示要授权哪种操作。第二个和第三个参数将是参数或 None 取决于第一个参数。第 4 个参数是数据库的名称(“main”、“temp”等)(如果适用)。第 5 个参数是负责访问尝试的最内层触发器或视图的名称,如果此访问尝试直接来自输入 SQL 代码,则为 None。

因此,签名应该是:

def select_authorizer(sqltype, arg1, arg2, dbname, source):

通常,在测试这样的回调时,使用*args通配符参数可以轻松进行测试:

def select_authorizer(*args):
     print(args)
     return sqlite.SQLITE_OK

上面的回调打印出来:

(21, None, None, None, None)
(20, 'A', 'name', 'main', None)

当我运行你的测试时SELECT

请参阅SQLite 的 C 参考set_authorizer和使用的各种常量的操作代码参考

于 2012-08-22T08:04:14.127 回答
1

Martijn Pieter 的回答是正确的;当我阅读那段时,我不知何故错过了第五个论点。

我还发现更仔细地阅读文档可以真正帮助我自己弄清楚这一点是以下行:sqlite.enable_callback_tracebacks(True)
此行将导致 sqlite 打印回调函数中发生的错误的回溯。

于 2012-08-22T18:48:56.823 回答