我正在尝试使用命名参数将字典中的数据插入数据库。我使用了一个简单的SQL语句
SQL = "INSERT INTO status (location, arrival, departure) VALUES (:location, :arrival,:departure)"
dict = {'location': 'somewhere', 'arrival': '1000', 'departure': '1001'}
c.execute(SQL,dict)
在“位置”中插入某处,在“到达”列中插入1000,在“出发”列中插入1001。
我将实际拥有的数据将包含位置,但可能包含到达或离开,但可能不同时包含两者(在这种情况下,表中不能包含任何内容或空值)。在本例中,我得到sqlite3.ProgrammingError:您没有为绑定2提供值。
我可以使用defaultdict解决这个问题:
c.execute(SQL,defaultdict(str,dict))
为了让事情稍微复杂一点,我实际上会有一个字典列表,其中包含多个到达或离开地点。
({'location': 'place1', 'departure': '1000'},
{'location': 'palce2', 'arrival': '1010'},
{'location': 'place2', 'departure': '1001'})
我想用c.executemany运行这个程序,但是现在不能使用defaultdict。
我可以遍历列表中的每个字典并运行许多c.execute语句,但是execute many似乎是一种更整洁的方法。
为了方便起见,我简化了这个示例,实际的数据在字典中有更多的条目,我从JSON文本文件构建它。
有人对我怎么做有什么建议吗?
这个问题有一个更简单的解决方案,在大多数情况下应该是可行的;只需传递给
executemany
一个defaultdict
列表,而不是dict
列表。换言之,如果从头开始将行构建为
defaultdict
,则可以将defaultdict
行的列表直接传递给命令executemany
,而不是将它们构建为字典,然后在使用executemany
之前修补这种情况。下面的工作示例(python3.4.3)说明了这一点:
如果你运行它,它会打印:
使用
None
插入NULL
:您可以使用默认字典和生成器将其与
executemany()
一起使用:相关问题 更多 >
编程相关推荐