sqlite3.OperationalError:在“ The”附近:语法错误/参数化sql

时间:2018-10-19 05:33:35

标签: python-3.x sqlite

我一直收到错误:

sqlite3.OperationalError: near "The": syntax error

故障排除后,我确定了造成该问题的原因是书名中出现了撇号(')。我已经读过我需要参数化sql,但是这样做很麻烦。有问题的代码:

#Connect to database
top_ten_db = connect('top_ten.db')

#Retrieve view of database
db_view = top_ten_db.cursor()

#Insert the information from selected list. Simple loop to do akk the insert commands neatly.
ranking = ['1','2','3','4','5','6','7','8','9','10']
ranking_list_number = 0
name_list_number = 0
description_list_number = 0
for information in range(10):
    db_view.execute('''INSERT INTO top_ten VALUES ("'''+ date[0] +'''","''' + ranking[ranking_list_number] + ''' ","''' + NYT_names[name_list_number] +'''","'''+ description[description_list_number] +'''");''')
    ranking_list_number = ranking_list_number+1
    name_list_number = name_list_number +1
    description_list_number = description_list_number +1

#Commit changes
top_ten_db.commit()
#Close the database
db_view.close()
top_ten_db.close()

请注意,变量“ date”,“ NYT_names”和“ description” 都是使用正则表达式搜索找到的,这些搜索是从在线网站上获取信息的,所以我对输入没有任何控制。

>

还应注意,直到引入撇号为止,代码都可以正常工作。此外,该书的标题(如果需要)是:钟表匠的女儿

1 个答案:

答案 0 :(得分:-2)

您应该通过将单引号/单引号加倍来对其进行转义(使用''来表示文字'):

db_view.execute('''INSERT INTO top_ten VALUES ("'''+ date[0] +'''","''' + ranking[ranking_list_number] + ''' ","''' + NYT_names[name_list_number] +'''","'''+ description[description_list_number].replace("'", "''") +'''");''')

摘录自documentation

  

通过将字符串用单引号引起来来形成字符串常量   (')。字符串中的单引号可以通过将两个   连续单引号-如Pascal。 C样式转义使用   不支持反斜杠字符,因为它们不是标准的   SQL。 BLOB文字是包含十六进制数据和   前面带有单个“ x”或“ X”字符。 ...文字值可以   也是令牌“ NULL”。

或者,您可以使用绑定参数:

db_view.execute('INSERT INTO top_ten VALUES (?, ?, ?, ?)', (date[0], ranking[ranking_list_number], NYT_names[name_list_number], description[description_list_number]))