我试图用存储在字典中的数据用Python3填充sqlite3数据库。我的代码中的问题似乎在此代码段中。
matchlist=['id','handicap','goal line','corner line']
heads='"'+'","'.join([a for a in list(match.keys()) if a in matchlist])+'"'
llaves=':'+',:'.join([a for a in list(match.keys()) if a in matchlist])
cur.execute('''INSERT or IGNORE INTO preodds ({}) VALUES ({});'''.format(heads,llaves),
match)
这使我在行旁边出现操作错误。
显然,当您尝试在名称中包含空格的列中插入时,需要“转义”它们。为此,我还修改了我的llaves字符串,方法如下:
llaves='":'+'",":'.join([a for a in list(match.keys()) if a in matchlist])+'"'
这样做可以解决我的问题,但不是用dict提供的值填充表,而是用llaves字符串中的文字值填充。
这是为什么?更重要的是,如果我有一个表格,其中各列的空格都为空白,那么如何使用dict数据填充行?
答案 0 :(得分:0)
您的原始代码可能会产生此结果
SELECT COUNT(*) ...
请注意参数名称中的空格...以冒号(INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
VALUES (:id,:handicap,:goal line,:corner line)
开头的名称。那是问题。
您尝试的解决方案只是将字符串文字作为值提交,因此正是所插入的内容。
:
引号可用于分隔对象名称,但是在其他情况下,引号被解释为文字字符串值定界符。 here找到了确定其如何解释引用的值的精确规则。
据我所知,参数无法转义,因此不能包含空格或其他特殊字符,至少没有任何记载。参见sqlite docs。
如果要动态构建参数列表,则应从参数名称中删除所有空格。或者,您可以只使用带有INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
VALUES (":id",":handicap",":goal line",":corner line")
字符的未命名参数。不管哪种方式,参数都按照它们出现的顺序分配值,因此不会有任何区别。
类似的东西:
?
或
INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
VALUES (:id,:handicap,:goalline,:cornerline)