我很好奇,如何调试SQLite3语法。我每天使用这个SQL,有时语法错误,我无法修复。
例如此查询:
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"?":语法错误
您知道如何找出错误的位置吗?
答案 0 :(得分:1)
您是否尝试过设置此标记:
/* just to make the icon visible */
.fa.fa-icon {
display:inline-block;
width:1em; height:1em;
background:orange;
}
a {
display:inline-block;
width: 1em; /* set to same as icon */
color:white; /* set to same as background */
overflow:hidden;
}
以下是文档:https://docs.python.org/2/library/sqlite3.html#sqlite3.enable_callback_tracebacks
编辑:尝试自己,在这种情况下没有多大帮助。你也可以尝试记录执行的sql,就像这里解释的那样:https://stackoverflow.com/a/13647368/1338845然后看看sql是否应该是它。答案 1 :(得分: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'))
答案 2 :(得分: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'))