使用Python参数替换向Sqlite插入记录,其中某些字段为空

2 投票
3 回答
3910 浏览
提问于 2025-04-16 00:37

我正在运行这样的查询:

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,这样才能用实际的值来更新这个副本。

撰写回答