Python sqlite3集合\授权器方法的故障
我正在尝试使用Python sqlite3集合\授权器方法的故障,python,sqlite,Python,Sqlite,我正在尝试使用连接。将\u 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.co
连接。将\u 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:notauthorized
,没有打印出“Test”。我猜我可能设置了我的授权人,但它甚至没有调用它。(尽管错误消息确实没有传达这一点)但根据文档,此设置看起来是正确的
编辑:将
sqlite.sqlite\u好的
更改为sqlite.sqlite\u好的
,但由于该方法似乎根本没有被调用,因此毫不奇怪,这没有任何帮助。授权者回调需要5个参数,但您只接受四个:
回调的第一个参数表示要授权的操作类型。第二个和第三个参数将是参数或无参数,具体取决于第一个参数。第四个参数是数据库的名称(“main”、“temp”等)(如果适用)。第5个参数是负责访问尝试的最内部触发器或视图的名称,如果此访问尝试直接来自输入SQL代码,则为“无”
因此,签名应为:
通常,在测试这样的回调时,使用*args
通配符参数可以简化测试:
def select_authorizer(*args):
print(args)
return sqlite.SQLITE_OK
上面的回调输出:
(21, None, None, None, None)
(20, 'A', 'name', 'main', None)
当我运行测试时,选择
有关使用的各种常数,请参见和。Martijn Pieter的答案是正确的;当我读到那一段时,不知怎的错过了第五个论点
我还发现,通过更仔细地阅读文档,可以真正帮助我自己弄明白这一点的是:sqlite.enable\u callback\u traceback(True)
此行将导致sqlite打印回调函数中发生的错误的回溯
(21, None, None, None, None)
(20, 'A', 'name', 'main', None)