首页 > 解决方案 > 在 sqlite3 中插入​​带有空格的列名

问题描述

我正在尝试用 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 数据填充行?

标签: python-3.xsqlite

解决方案


您的原始代码可能会产生这个

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")

引号可用于分隔对象名称,但在其他上下文中,引号被解释为文字字符串值分隔符在这里可以找到确定它如何解释引用值的精确规则。

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

如果要动态构建参数列表,则应去掉参数名称中的所有空格。或者,您也可以使用?字符来使用未命名的参数。无论哪种方式,参数都按照它们出现的顺序分配值,因此没有区别。

就像是:

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

或者

INSERT or IGNORE INTO preodds ("id","handicap","goal line","corner line")
 VALUES (?, ?, ?, ?)

推荐阅读