sqlite3.OperationalError: возле "The": синтаксическая ошибка / Параметризация sql - PullRequest
0 голосов
/ 19 октября 2018

Я получаю сообщение об ошибке:

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 голосов
/ 19 октября 2018

Вы должны избегать одинарных кавычек / апострофов, удваивая их (используйте '' для обозначения литерала '):

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

Выдержка из документации :

Строковая константа формируется путем заключения строки в одинарные кавычки (').Одиночная кавычка в строке может быть закодирована путем помещения двух одинарных кавычек в строку - как в Паскале.Экранирование в стиле 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]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...