Как исправить ошибку sqlite3.OperationalError: near "?": 'в python sqlite? - PullRequest
0 голосов
/ 26 января 2019

Я использую sqlite для организации данных, извлекаемых с помощью скрипта скребка, но у меня возникают проблемы с выполнением команды «вставить в».

Я делаю скребок для сайта электроники, как новичок в Python-энтузиасте.У меня уже был работающий скрипт, который бы очищал все страницы до тех пор, пока я не решил изменить код, чтобы создать новый столбец с ценами и назвать этот столбец, используя сегодняшнюю дату.Теперь по какой-то причине команда SQL, которая вставляет данные в таблицу, отказывается выполняться с новым столбцом, который я добавляю.

Попытка добавления нового столбца в команду SQL с помощью?Метод и .format () метод безуспешно.Перепробовал все виды 'мест вокруг? S и {} s.

Это код:

class Product:
    def __init__(self, prodId, title, price=None):
        self.prodId = prodId
        self.title = title
        self.price = price
        self.currDatePriceCloumnName = date + 'Price'

    def insertToTable(self):
        self.addColumn()
        conn = sqlite3.connect(databaseName)
        c = conn.cursor()
        c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))
        conn.commit()
        conn.close()

    def addColumn(self):
        conn = sqlite3.connect(databaseName)
        c = conn.cursor()
        try:
            c.execute("alter table {} add column '?'".format(table),(str(self.currDatePriceCloumnName),))
            conn.commit()
            conn.close()
        except:
            pass

я ожидал, что c.execute в insertToTable, чтобы вставитьданные в таблицу, но я получаю следующую ошибку:

  File "/home/sergio/Desktop/test/scraper.py", line 67, in insertToTable
    c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))
sqlite3.OperationalError: near "?": syntax error

Странно то, что столбец создан, но не заполнен.Когда я использовал метод .format(), у ошибки было нужное имя столбца вместо?, Это говорит мне, что проблема может быть связана с тем фактом, что я использую self.currDatePriceCloumnName, но я застрял отсюда.

Пожалуйста, помогите .. Спасибо заранее!=]

1 Ответ

0 голосов
/ 26 января 2019

У вас есть опечатка в:

c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))

В

values (?,?,?)".format(table),

Конец .format (таблица) - это все, что вы вставили в строку. Дополнительный ) заставляет .format () завершать выдачу синтаксической ошибки, потому что он не ожидает ,. Вы не передаете никаких других значений.

При этом не используйте форматирование строк с операторами SQL в будущем (как примечание общего характера), так как это плохая практика в целях безопасности:

https://www.w3schools.com/sql/sql_injection.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...