2015-11-30 4 views
0

Мне любопытно, как отлаживать синтаксис SQLite3. Я работаю с этим SQL на ежедневной основе, и иногда имею синтаксическую ошибку, которую я не могу исправить.SQLite3 синтаксическая ошибка отладки

Например, этот запрос:

self.cur.execute("""INSERT INTO table(?,?,?,?,?,?,?,?,?,?,?,?,?) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)""", ('category', 'product_number', 'product', 'availability', 'manufacturer', 'weight', 'inner', 'outer', 'width', 'list_price', 'discount', 'gross_price', 'net_price', u'Wellenscheiben BKAGI..', 'BKAGI15', '-', 'This', 'PePS', '138,00', '50,00', '78,00', '6,50', '36,93', '55,00', '19,78', '16,62')) 

sqlite3.OperationalError: near "?": syntax error

Вы знаете, как узнать, где ошибка?

+0

Вы не можете (и не должны) использовать параметры запроса для идентификаторов (имен таблиц и столбцов). –

ответ

0

Вы пробовали установки этого флага:

sqlite3.enable_callback_tracebacks(True) 

Вот документы: https://docs.python.org/2/library/sqlite3.html#sqlite3.enable_callback_tracebacks

EDIT: попробовал себя, не очень помогает в этом случае. Вы также можете попытаться записать выполненный sql, как это объясняется здесь: https://stackoverflow.com/a/13647368/1338845, а затем посмотреть, является ли этот sql тем, чем он должен быть.

0

Непонятно, хотите ли вы просто общий совет по отладке или помощь в этом вопросе. Если последнее:

Похоже, что вы можете использовать заполнители ? для значений, а не для имен столбцов. Либо включать столбцы непосредственно в строке, или если вы пытаетесь сократить длину заявления для удобства чтения, что-то вроде:

cols = ','.join('category', 'product_number', 'product', 'availability', 'manufacturer', 'weight', 'inner', 'outer', 'width', 'list_price', 'discount', 'gross_price', 'net_price') 
self.cur.execute('INSERT INTO table({}) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)'.format(cols), (u'Wellenscheiben BKAGI..', 'BKAGI15', '-', 'This', 'PePS', '138,00', '50,00', '78,00', '6,50', '36,93', '55,00', '19,78', '16,62')) 
0

Правила, как правило, чтобы открыть терминал (консоль под Windows) и введите команду в sqlite3 (или sqlite3.exe).

Или конечно мало пользы, когда проблема в переменной замене, как здесь. Но SQL разрешает такую ​​замену переменных для значений, а не для имен таблиц или столбцов.

Так для примера, правильный синтаксис:

self.cur.execute("""INSERT INTO table(category, product_number, product, 
     availability, manufacturer, weight, inner, outer, width, list_price, 
     discount, gross_price, net_price) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)""", 
    u"Wellenscheiben BKAGI..", "BKAGI15', '-', 'This', 'PePS', '138,00', '50,00', 
    '78,00', '6,50', '36,93', '55,00', '19,78', '16,62')) 
Смежные вопросы