SQLite3插入报未提供第7个绑定值 占位符与字典键匹配问题
报错根因
使用SQLite3的命名占位符(:xxx格式)做参数化插入时,占位符名称必须和传入字典的键名完全匹配,这个匹配规则和表字段名无关。
你的报错是因为占位符和传入字典的键存在3处不匹配:
- 第7位占位符写的是
:from_addrs,但传入字典里对应发送方地址的键名是from,不存在from_addrs键,因此直接触发sqlite3.ProgrammingError: You did not supply a value for binding 7错误 - 第8位占位符写的是
:to_addrs,但传入字典里对应接收方地址的键名是to,同样无匹配值 - 最后一位占位符写的是
:confirmation,但传入字典里对应确认数的键名是confirmations(末尾多了s),也无匹配值
你之前因为from是SQL保留关键字,把表字段命名为from_addrs、to_addrs的操作是正确的,但不需要让占位符名和表字段名强制对齐,只要插入语句中显式声明字段顺序、值和字段一一对应即可。
修复方法
推荐直接修改插入语句,显式指定字段列表,同时把占位符改成和传入字典键名完全一致的名称,不需要修改原始result数据,代码如下:
# 建表语句保持原有写法即可 c.execute(''' CREATE TABLE rndTable ( blockNumber INTEGER, timeStamp INTEGER, hash BLOB, nonce INTEGER, blockHash BLOB, transactionIndex INTEGER, from_addrs BLOB, to_addrs BLOB, value INTEGER, gas INTEGER, gasPrice INTEGER, isError INTEGER, txreceipt_status INTEGER, input BLOB, contractAddress BLOB, cumulativeGasUsed INTEGER, gasUsed INTEGER, confirmation INTEGER ); ''') # 修改后的插入语句:显式指定字段顺序,占位符和result字典键名完全匹配 c.executemany(''' INSERT INTO rndTable ( blockNumber, timeStamp, hash, nonce, blockHash, transactionIndex, from_addrs, to_addrs, value, gas, gasPrice, isError, txreceipt_status, input, contractAddress, cumulativeGasUsed, gasUsed, confirmation ) VALUES ( :blockNumber, :timeStamp, :hash, :nonce, :blockHash, :transactionIndex, :from, :to, :value, :gas, :gasPrice, :isError, :txreceipt_status, :input, :contractAddress, :cumulativeGasUsed, :gasUsed, :confirmations ) ''', result) conn.commit()
如果不想改SQL语句,也可以在插入前批量预处理result列表里的每条字典数据:给每条记录新增from_addrs、to_addrs、confirmation三个键,值分别取原字典的from、to、confirmations对应的值,再删除原有三个键,即可适配原来写的插入语句。
注意:占位符名称不属于SQL执行语法的一部分,哪怕用保留字
from、to作为占位符名,也不会触发SQL语法错误,不需要刻意转义。
内容的提问来源于stack exchange,提问作者Gerrit van Rensburg
相关产品推荐
相关产品推荐

