1

这似乎是编程中的一个典型问题,但我在谷歌中没有发现任何有用的东西。这是代码:

file=open('list.txt','r')
    for line in file:
        cursor.execute("CREATE TABLE IF NOT EXISTS \
        %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \
        entry TEXT NOT NULL)" % line)
    file.close()
    cursor.close()
    db.close()

这是我尝试使用单引号创建表时的错误:

Traceback (most recent call last):
  File "test.py", line 104, in <module>
    entry TEXT NOT NULL)" % line)
  File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Hi 'Buddy!(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT,         entry ' at line 1")

MySQLdb.escape_string(line)顺便修一下

4

5 回答 5

1

afaik(请参阅此处的 MySQL 5.0 参考)您不允许在表名中使用单引号:

不带引号的标识符中允许的字符:

ASCII: [0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)
Extended: U+0080 .. U+FFFF
于 2011-07-22T16:33:36.963 回答
0

我不确定您为什么要这样做,我认为我应该建议重新考虑您的架构,但是您可以使用 backticks 转义表名`

# notice the `'s surrounding %s
for line in file:
    cursor.execute("CREATE TABLE IF NOT EXISTS \
    `%s`(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \
    entry TEXT NOT NULL)" % line)
于 2011-07-22T16:32:33.313 回答
0

试试这个 -

cursor.execute("CREATE TABLE IF NOT EXISTS '%s'(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)" % line)
于 2011-07-22T16:33:27.437 回答
0

不要使用 % 格式来输入值,而是将您的语句传递给您需要cursor.execute()替换%s的每个值,并将所有替换值的列表或元组作为您的第二个参数,例如:

stmt = "CREATE TABLE IF NOT EXISTS %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)"
value_list = [line]
cursor.execute(stmt, value_list)

这将为您执行所有必要的转义,因为它将您的字符串转换为有效的 SQL 文字。这直接来自MySQLdb User's Guide,下面是相关示例:

要执行查询,首先需要一个游标,然后可以对其执行查询:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

在这个例子中,max_price=5 那么为什么在字符串中使用 %s 呢?因为 MySQLdb 会将其转换为 SQL 文字值,即字符串 '5'。完成后,查询实际上会说“...WHERE price < 5”。

于 2011-07-22T16:33:41.307 回答
0

通常,如果您尝试像这样以编程方式创建表名,那么使用不同的模式会更开心。我建议制作一个这样的表,其中包含一个额外的列,其中包含您现在用于表名的字符串。

于 2011-07-22T17:02:42.363 回答