SQLite3语法错误调试

时间:2015-11-30 13:32:47

标签: python sqlite

我很好奇,如何调试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"?":语法错误

您知道如何找出错误的位置吗?

3 个答案:

答案 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'))