【问题标题】:mysql.connector.errors.ProgrammingError: 1064 (4200): You have an error in your SQL syntax;mysql.connector.errors.ProgrammingError: 1064 (4200): 你的 SQL 语法有错误;
【发布时间】:2017-08-13 23:41:13
【问题描述】:

我正在尝试将数据插入 MySQL 数据库。我正在使用 python 2.7,并且正在使用 mysql.connector。

我的错误是:

mysql.connector.errors.ProgrammingError: 1064 (4200): 你有一个 SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '%s) 附近使用正确的语法。

这表明我的代码中有错误,我尝试插入变量 np (VALUES (%s)");)。np 是“名词短语”,例如“滑板”。

import mysql.connector
from textblob import TextBlob

cnx = mysql.connector.connect(user='XXX', password='XXX',
                              host='XXXXX',
                              database='XXXX')

cursor = cnx.cursor(buffered=True)

Latest = ("SELECT * FROM SentAnalysis")
cursor.execute(Latest)

for row in cursor.fetchall():
    SentText = row[2]
    blob = TextBlob(SentText)
    for np in blob.noun_phrases:
        print(np)
        SQLInsertCmd = ("INSERT INTO TestNounPhrase (NPhrase) VALUES (%s)")
        cursor.execute(SQLInsertCmd,np)

cnx.commit()
cursor.close()
cnx.close()

手册中的示例是https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-transaction.html。例如

 "VALUES (%s, %s, %s, %s, %s)")

我看不出有什么不同。这个错误也在这里详细讨论:How can I fix MySQL error #1064?stackoverflow 上的其他类似示例已链接到reserved wordsRedundant comas。但是查看这些示例我无法发现明显的错误。

任何关于我哪里出错的建议将不胜感激。

【问题讨论】:

  • 如果您只有一个 VALUES 条目,我相信您的元组中需要一个逗号:VALUES (%s,)
  • 我更新为包含逗号,但仍然出现相同的错误。
  • 我推测问题至少部分是由于您尝试同时选择和插入。问题已投票 +1。
  • 在这种情况下有没有办法避免选择?选择当前提取运行“名词短语”分析所需的信息。然后将该分析的输出插入到另一个表中。我之前在同一个脚本中使用过 select 和 inserts 没有问题,例如选择数据-> 对数据运行情绪分析-> 然后将情绪结果插入新表中。
  • 修复它的正确方法是将包含要插入的值的元组转换为“完整元组”。例如:

标签: python mysql


【解决方案1】:

我认为这里的问题可能是查询末尾的分号。

祝你有美好的一天。

【讨论】:

  • 挣扎了几个小时,以为是准备好的声明问题。但这就是问题所在。
【解决方案2】:

SQL 查询中的 str 参数必须在引号 'str' 中。
因此,str 需要使用 '%s' 和 '',而数字需要使用不带 '' 的 %s:

cursor.execute("""INSERT INTO db_name (str,int,str,int)
                  VALUES ('%s', %s, '%s', %s)""" % (str,int,str,int))
cnx.commit()

【讨论】:

    【解决方案3】:

    您必须将包含要插入的值的元组转换为'完整元组'。 例如:

    for np in blob.noun_phrases:
            np=(np,)
    

    在一个通用示例中,如果您只有一列要插入,它将是:

    to_insert=('A value to insert',)
    

    最后,如果您一次要插入多个值:

    to_insert_multiple=[('value1',), ('value2',), ('valueN',)]
    

    我希望它有所帮助,它在 py3.7

    中对我有用

    【讨论】:

    • 这是正确答案 - cursor.executevalues 参数必须是 tuple,并且应避免字符串格式化/连接解决方​​案,因为引用错误和 SQL 注入的风险。
    【解决方案4】:

    试试这个

    SQLInsertCmd = """INSERT INTO
                      TestNounPhrase (NPhrase) VALUES ((%s))"""  % (np)
    cursor.execute(SQLInsertCmd)
    

    【讨论】:

    • 这会产生一个我找不到太多信息的新错误(与“单词”有关):“mysql.connector.errors.ProgrammingError.处理格式参数失败; Python 'word' 无法转换为 MySQL 类型”。
    • 如果你尝试,SQLInsertCmd = ("INSERT INTO TestNounPhrase (NPhrase) VALUES ((%s))") cursor.execute(SQLInsertCmd,[np])
    • 好吧,不是最pythonic的方式,但这应该可以解决它, SQLInsertCmd = """INSERT INTO TestNounPhrase (NPhrase) VALUES ((%s))""" % (np) cursor.execute (SQLInsertCmd)
    • 再次出错...它仍然引用 1064 (42000) 错误,但不是说“靠近 '%s”,而是说“靠近 'seymour'”。 'seymour' 是循环的第一次迭代的结果(对于 blob.noun_phrases 中的 np:),它从“SentText”列中提取“名词短语”。
    【解决方案5】:

    我对单参数语句也有同样的问题,这很有效:

    mycursor.execute("INSERT INTO cust (user) VALUES(%s)" % (username))
    

    【讨论】:

      【解决方案6】:

      我遇到了同样的错误,在寻找它的解决方案时,经过几次尝试我能够解决,我偶然发现了这个问题。错误是UPDATE 语句的WHERE 子句中的列名输入错误。我的列名是“ROLL_NO”,而不是我输入了“ROLL_NO”。 也请注意这一点。

      【讨论】:

        【解决方案7】:

        调用execute()方法时:

          cursor.execute(query, (param))
        

        应该是:

          cursor.execute(query, (param,))
        

        【讨论】:

          【解决方案8】:

          我对这个错误感到很困惑,因为其中一个列名是exit。请注意,数据库将接受此作为列名,但是当您尝试从 python 插入时,您需要用反引号覆盖该列 `

          【讨论】:

            【解决方案9】:

            mycursor.execute("插入表名(列)值(%s)"%data_variable)

            【讨论】:

            • 我怀疑这是否有帮助,甚至根本有效。为了说服我,请解释它是如何工作的以及为什么它应该解决问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-24
            • 2019-09-01
            相关资源
            最近更新 更多