1

问题

为什么%s转义序列在我的带有 MySQL 包的 Python 脚本中不起作用?

背景和代码

我对以下行有疑问:

cursor.execute("""INSERT INTO `%s` (Date, Counter_in, Counter_out, Interface_name) VALUES (CURRENT_TIMESTAMP, %s, %s, %s)""", (Equipment, In_Octets, Out_Octets, interface))

我收到以下错误消息:

Traceback (most recent call last):
  File "SNMP_Query.py", line 41, in <module>
    cursor.execute("""INSERT INTO `%s` (Date, Counter_in, Counter_out, Interface_name) VALUES (CURRENT_TIMESTAMP, %s, %s, %s)""", (Equipment, In_Octets, Out_Octets, interface))
  File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1146, "Table 'Sipartech.'itx6-f10-1'' doesn't exist")

我已经仔细检查了这张桌子itx6-f10-1,它确实存在。

4

1 回答 1

1

我在您的插入查询中注意到的一个错误是您编写Date的列名没有 ( ` ) 符号,其中 date 是MySQL 日期类型:关键字。因此,在您的查询中:-

cursor.execute("""INSERT INTO `%s` (Date, Counter_in, 
                                    ^

应该

cursor.execute("""INSERT INTO `%s` (`Date`, `Counter_in`,                    
                                     ^ added (`)

其次,我不明白为什么 MySQL:1146 错误?当数据库文件丢失时会发生这种情况。
正如我所注意到%s的那样,您可以从Equipment代码中的 Python 变量中找到数据库名称。

但是为什么你会得到:

  'Sipartech.'itx6-f10-1''
             ^          ^  extra '  

当然这不能是数据库名称,可能是 mysql error:1146 的原因,你应该得到:

 'Sipartech.itx6-f10-1'  

检查代码并查询。

此外,如果您对 有疑问%s,则可以使用string.formate()function 而不是%s. 喜欢:

      """  
      INSERT INTO {0} ( `Date`, 
                        `Counter_in`, 
                        `Counter_out`, 
                        `Interface_name`) 
       VALUES (CURRENT_TIMESTAMP, {1}, {2}, {3})
       """.formate(Equipment, In_Octets, Out_Octets, interface))  

另外,请记住,如果不是In_Octets, Out_Octets, interface整数,则将查询字符串中 的每个大括号括起来。'{}

于 2013-03-24T16:23:20.873 回答