Python 3.x 在sqlite3中插入带空格的列名

Python 3.x 在sqlite3中插入带空格的列名,python-3.x,sqlite,Python 3.x,Sqlite,我试图用Python3填充sqlite3数据库,数据存储在dict中。代码中的问题似乎就在这段代码中 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

我试图用Python3填充sqlite3数据库,数据存储在dict中。代码中的问题似乎就在这段代码中

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数据填充行呢?

您的原始代码可能会产生这种情况

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",":goal line",":corner line")
引号可用于分隔对象名称,但在其他上下文中,引号被解释为文字字符串值分隔符。找到了确定如何解释引用值的精确规则

据我所知,参数不能转义,因此不能包含空格或其他特殊字符,至少没有文档记录。看

如果要动态构建参数列表,则应该从参数名称中去掉所有空格。或者,您也可以使用
字符使用未命名的参数。无论哪种方式,参数都是按其出现的顺序指定值的,因此不会有任何差异

比如:

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (:id,:handicap,:goalline,:cornerline)


您可以为参数尝试另一种选择。在冒号后面加引号。如果这样做很好,但即使不起作用,一般原则是永远不要在运算符(或其他特殊字符)周围加引号,因为引号封装、分组和更改特殊字符的含义。换言之,请尝试以下操作:
:“+”,:“'.join([a代表In-list(match.keys()),如果a代表In-matchlist])+”
。这将产生
:“目标线”
,它更有可能按预期工作。我尝试了后一种方法,但没有成功。所以最后,我在所有的名字上加了一个空格,这就解决了这个问题。
INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (?, ?, ?, ?)