python-3.x - 在 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 数据填充行?
解决方案
您的原始代码可能会产生这个
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 (?, ?, ?, ?)
推荐阅读
- grammar - 使用 Perl 6 语法在原始正则表达式中传递变量
- python - 如何使用python在合同终止前找出客户的计费日期?
- c# - 如何格式化复杂的 linq 表达式?
- python - 获取 UnboundLocalError:在网络抓取应用程序中分配之前引用的局部变量“价格”
- json - Symfony 3.4 中的 Ajax 请求
- html - 打开/关闭导航栏
- javascript - React-tagsinput 不允许我粘贴拆分输入
- python - 您如何在每一行的映射中利用分区信息?
- ios - 布局锚和 NSLayoutConstraint 不起作用?
- ios - 如何禁用 MGLAnnotation 的用户交互?