为了账号安全,请及时绑定邮箱和手机立即绑定

在SQLite数据库中存储布尔

在SQLite数据库中存储布尔

aluckdog 2021-03-16 13:09:04
在我的表模式中:... 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),但无济于事。
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您想要将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'):

...     print row

... 

(True,)

(False,)


查看完整回答
反对 回复 2021-03-30
?
浮云间

TA贡献1829条经验 获得超4个赞

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):

    val = int(col) == 1

    print val, type(val)

    return val


sqlite3.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返回的,这就是我想要的-但是,您将需要确保处理异常,否则它们会被默默地抑制。


查看完整回答
反对 回复 2021-03-30
  • 2 回答
  • 0 关注
  • 318 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信