我的代码尝试遍历字典,#34; dbMap",并根据dbMAP的键和值执行MySQL INSERT INTO语句:
for key in dbMap:
try:
cursor.execute("INSERT INTO '%s' (id, additional_details) VALUES (123, '%s')", (key, dbMap[key]))
except UnicodeEncodeError:
pass
运行上面的代码时出现以下错误:
_mysql_exceptions.ProgrammingError:(1064,"您的SQL语法中有错误;请查看与您的MySQL服务器版本对应的手册,以便在#39;'&#39附近使用正确的语法39; random_key'(id,additional_details)VALUES(123,' random_value'第1行和第34行;)
我没有看到我违反的MySQL语法,我正在关注以下资源寻求帮助:
http://www.mikusa.com/python-mysql-docs/query.html
http://www.w3schools.com/sql/sql_insert.asp
更新:当我尝试这个时:
for key in dbMap:
try:
cursor.execute("INSERT INTO {} (id, additional_details) VALUES (123, '{}')".format(key, dbMap[key]))
except UnicodeEncodeError:
pass
我得到了一个不同的错误:
_mysql_exceptions.OperationalError:(1054,"未知列' id'在'字段列表'")
更新2:
for key in dbMap:
try:
query = "INSERT INTO `%s` (id, additional_details) VALUES(123, %%s)" % key
cursor.execute(query, dbMap[key])
except UnicodeEncodeError:
pass
收到新错误:TypeError:并非在字符串格式化过程中转换所有参数
非常感谢帮助我弄清楚出了什么问题的任何帮助
答案 0 :(得分:0)
使用Python的MySQL库时,我认为您不希望在变量周围使用'
。我相信它们会使%s
按字面解释,而不是让它们被替换。已经有一段时间了,因为我已经使用过这种方法了,所以我可能会偏离基础。试试这个:
try:
cursor.execute("INSERT INTO %s (id, additional_details) VALUES (123, %s)", (key, dbMap[key]))
Python会替换你。
另外,考虑使用抽象来防止SQL注入。退房 - this post - SO中最常见的一个。
另外,由于我正在仔细研究你的Python系列,以及你的实际错误,我认为你的系列没有按照你的想法做到。
for key in dbMap
将生成dbMap
的值,而不是关键值 - 因此当您调用dbMap[key]
时,由于key
不是索引,因此会出现错误。这也可能意味着您没有使用INSERT INTO key
获得正确的表格。值得深思。尝试:
for idx, value in enumerate(dbMap):
cursor.execute("INSERT INTO %s (id, additional_details) VALUES (123, %s)", (idx, dbMap[idx]))
这将允许您访问键索引(idx
)和mapDB
值。
答案 1 :(得分:0)
我刚刚跳过一个解释器来玩这个,看起来你不能用MySQLdb API中的表名替换它,因为它会把你的替换放在引号中(表名可以被反引号但不引用),所以你必须分两步完成。冰山也是正确的,你不提供自己的报价。
我的样本:
>>> query = "INSERT INTO %s (id, login) VALUES (1972, %%s)" % 'users'
>>> cursor.execute(query, ('TEST-LOGIN123',))
>>> 1L
尝试
for key in dbMap:
try:
query = "INSERT INTO `%s` (id, additional_details) VALUES (123, %%s)" % key
cursor.execute(query, (dbMap[key],))
except UnicodeEncodeError:
pass
答案 2 :(得分:0)
mysqldb库只允许您替换值,而不是表:
Python and MySQLdb: substitution of table resulting in syntax error