在python mysqldb中转义单引号

时间:2011-07-22 16:19:15

标签: python mysql mysql-python

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

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()

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")
不要修复它

5 个答案:

答案 0 :(得分:1)

afaik(see MySQL 5.0 Reference here)您不允许在表名中使用单引号:

  

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

ASCII: [0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)
Extended: U+0080 .. U+FFFF

答案 1 :(得分:0)

我不确定你为什么这样做,我认为我应该建议重新考虑你的架构,但你可以使用反引号`来转义表名。

# 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)

答案 2 :(得分:0)

试试这个 -

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

答案 3 :(得分: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'。当它完成后,查询实际上会说“......价格<5”。

答案 4 :(得分:0)

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