gpt4 book ai didi

python - 在 SQLite 数据库中存储 bool 值

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:30 32 4
gpt4 key购买 nike

在我的表架构中:

... disabled BOOLEAN, ...

当连接到数据库时:

db = sqlite3.connect(f, detect_types=sqlite3.PARSE_DECLTYPES)
sqlite3.register_converter("BOOLEAN", myfunc)

我这样插入一条记录:

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

连同包含 disabled: False 的参数字典。

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

def myfunc(x):
print x, type(x)

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

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

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

最佳答案

您想对两个方向使用 register_adapterregister_converter 的组合:

sqlite3.register_adapter(bool, int)
sqlite3.register_converter("BOOLEAN", lambda v: bool(int(v)))

SQLite 使用 dynamic type system但对于自定义类型,它无法确定 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,)

关于python - 在 SQLite 数据库中存储 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936608/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com