使用Python参数替换向Sqlite插入记录,其中某些字段为空
我正在运行这样的查询:
insert into mytable (id, col1, col2)
values (:ID, :COL1, :COL2)
在Python中,可以用这种形式的字典来配合上面的查询进行参数替换:
d = { 'ID' : 0, 'COL1' : 'hi', 'COL2' : 'there' }
cursor.execute(sql_insert, d)
但在实际问题中,有很多列和很多行。有时候,填充字典的数据源没有某个条目。不过,如果字典比较短,Sqlite会抱怨说提供的绑定数量不正确,而不是给我一个方法来在这些没有填充的列中添加空字符串或NULL。
我有点懒,或者说有点完美主义。我可以写一些代码来把缺失的字段添加到字典中。我只是想找一个优雅的解决方案,不需要重复列出字段的列表。
我尝试用一个修改过的字典来重载字典,如果字段缺失就返回一个空字符串。
3 个回答
0
DEFAULT约束是用来指定在插入数据时使用的默认值。这个默认值可以是NULL(表示没有值),也可以是一个字符串常量、一个数字,或者是用括号括起来的常量表达式。
引用自 这里。
所以使用CREATE
可以这样写:
CREATE mytable {
id INTEGER PRIMARY KEY,
col1 TEXT DEFAULT 'Hello, World!',
col2 TEXT DEFAULT 'The cake in a lie'
}
0
老实说,我不是很确定你在问什么。看起来你是想为一个表格的行构建一个插入语句,但你手头有一些字段的值,但不是全部。
你可以这样构建你的查询(利用 dict.get
方法,当找不到某个键时会返回 None
):
>>> columns = ['id','col1','col2','col_missing']
>>> myData = {'id': 0, 'col1': 'hi', 'col2':'there'}
>>> myQuery = 'insert into mytable (%s) values (%s)' % (",".join(columns),",".join(['%s']*len(columns)))
>>> myArgs = [ myData.get(x) for x in columns ]
>>> myQuery
'insert into mytable (id,col1,col2,col_missing) values (%s,%s,%s,%s)'
>>> myArgs
[0, 'hi', 'there', None]
>>> cursor.execute(myQuery,myArgs)
7
我还没确认这个方法是否有效,但我觉得应该可以:
from collections import defaultdict
d = { 'ID' : 0, 'COL1' : 'hi' }
cursor.execute(sql_insert, defaultdict(str, d))
defaultdict
是一种特殊的字典,它的特点是当你查找一个不存在的键时,不会报错,而是自动生成一个新的值。
当然,这种方法只适用于所有的值都需要相同的默认值,比如空字符串或者 None。如果你需要不同的默认值,那你就需要先准备一个包含默认值的字典,然后可以这样做:
DEFAULTS = { ... whatever ... }
d = { 'ID' : 0, 'COL1' : 'hi' }
cursor.execute(sql_insert, dict(DEFAULTS).update(d))
注意,每次你都必须复制 DEFAULTS,这样才能用实际的值来更新这个副本。