Python MySQLdb" INSERT INTO"问题

时间:2015-06-19 19:19:57

标签: python mysql dictionary mysql-python

我的代码尝试遍历字典,#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:并非在字符串格式化过程中转换所有参数

非常感谢帮助我弄清楚出了什么问题的任何帮助

3 个答案:

答案 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