这似乎是编程中的典型问题,但我没有在谷歌中找到任何有用的东西。
这是代码:
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")
答案 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)
通常,如果您尝试以编程方式创建表名,那么使用不同的模式会更快乐。我建议像这样制作一个表,另外一列将包含你现在用于表名的字符串。