【问题标题】:Python MySQLdb "INSERT INTO" IssuePython MySQLdb“插入”问题
【发布时间】:2015-09-05 21:16:39
【问题描述】:

我的代码尝试遍历字典“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 服务器版本相对应的手册,了解在 '''random_key'' (id, additional_details) VALUES ( 123, 'random_value' 在第 1 行")

我没有看到我违反了什么 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, "'field list' 中的未知列 '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: 在字符串格式化期间并非所有参数都被转换

非常感谢任何帮助我找出问题所在

【问题讨论】:

标签: python mysql dictionary mysql-python


【解决方案1】:

在使用 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 值。

【讨论】:

  • 不幸的是,删除单引号并没有解决问题。不过,我会研究 SQL 注入的替代方案,谢谢
【解决方案2】:

我刚跳进一个解释器来玩这个,看起来你不能在 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 步方法,我得到了一个 TypeError,不知道发生了什么。我将其包含在问题更新中
  • @BlytheSimmons “dbMap[key]”中有什么?是否有任何内容元组?您有一个要替换的 %s,但如果您通过长度大于 1 的元组传递多个值以替换它,您将看到“TypeError:字符串格式化期间并非所有参数都被转换”
  • 我返回了每个值的类型,它返回了:
  • 我使用了 str(key) 和 str(dbMap[key]) 仍然出现类型错误
【解决方案3】:

mysqldb 库只允许您替换值,而不是表:

Python and MySQLdb: substitution of table resulting in syntax error

【讨论】:

    【解决方案4】:
    def insert_jugador():
    if request.method == 'POST':
        apellidos = request.form['apellidos']
        nombres = request.form['nombres']
        direccion = request.form['direccion']
    
        SqlConsulta = mysql.connection.cursor()
        SqlConsulta.execute("INSERT INTO JUGADORES (APELLIDOS, NOMBRES, 
        DIRECCION, ID_LOCALIDAD) VALUES (%s, %s, %s, 5)", (apellidos, 
        nombres, direccion))
    
        mysql.connection.commit()
    
        return 'Jugador Insertado Exitosamente...'
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2011-08-06
    • 2018-05-11
    • 2013-12-26
    • 2023-03-26
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多