在SQLite数据库中存储布尔

在我的表模式中:


... disabled BOOLEAN, ...

连接到数据库时:


db = sqlite3.connect(f, detect_types=sqlite3.PARSE_DECLTYPES)

sqlite3.register_converter("BOOLEAN", myfunc)

我像这样插入一条记录:


INSERT INTO mytable (disabled, ...) VALUES (:disabled, ...)

连同包含disabled的参数dict一起:False。


当我读回该记录时,将调用myfunc来转换BOOLEAN类型:


def myfunc(x):

    print x, type(x)

结果:(0, <type 'str'> 当我想为False时,当然评估为True)


我希望将布尔值存储为1字节的整数,我只想在读取记录时将它们转换为Python布尔值(代码的其他部分期望布尔值不是整数)。SQLite是在调用myfunc之前将它们存储为字符串,还是将它们转换为字符串?为什么?


PS-我尝试使用sqlite3.register_adapter(bool, int),但无济于事。


aluckdog
浏览 334回答 2
2回答

芜湖不芜

您想要将register_adapter和的组合register_converter用于两个方向:sqlite3.register_adapter(bool, int)sqlite3.register_converter("BOOLEAN", lambda v: bool(int(v)))SQLite使用动态类型系统,但是对于自定义类型,它无法确定0是字符串还是整数,因此您可以在此处找到字符串。或者,使用:sqlite3.register_converter("BOOLEAN", lambda v: v != '0')当涉及到遗留数据时,它要灵活得多,而且健壮得多,但是也许您想引发一个例外。演示:>>> import sqlite3>>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)>>> sqlite3.register_adapter(bool, int)>>> sqlite3.register_converter("BOOLEAN", lambda v: bool(int(v)))>>> db.execute('CREATE TABLE foo (bar BOOLEAN)')<sqlite3.Cursor object at 0x10a17a340>>>> db.execute('INSERT INTO foo VALUES (?)', (True,))<sqlite3.Cursor object at 0x10a17a3b0>>>> db.execute('INSERT INTO foo VALUES (?)', (False,))<sqlite3.Cursor object at 0x10a17a340>>>> for row in db.execute('SELECT * FROM foo'):...&nbsp; &nbsp; &nbsp;print row...&nbsp;(True,)(False,)

浮云间

sqlite3没有boolean类型-只需将您的字段存储为integer:>>> import sqlite3>>> db = sqlite3.connect(':memory:')>>> db.execute('create table test (col1 integer)')<sqlite3.Cursor object at 0x3737880>>>> db.execute('insert into test values (?)', (1,))<sqlite3.Cursor object at 0x3737960>>>> print list(db.execute('select * from test'))[(1,)]自定义转换器类型采用存储列的字符串表示形式,然后期望使用它来从中创建新类型...如果您做了类似的事情:db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)def myfunc(col):&nbsp; &nbsp; val = int(col) == 1&nbsp; &nbsp; print val, type(val)&nbsp; &nbsp; return valsqlite3.register_converter('boolean', myfunc)db.execute('create table blah (something boolean)')db.executemany('insert into blah values (?)', [(True,), (False,)])list(db.execute('select * from blah'))您会得到bool返回的,这就是我想要的-但是,您将需要确保处理异常,否则它们会被默默地抑制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python