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