mysql.connector.errors.ProgrammingError: 1064 (4200): 你的 SQL 语法有错误;

Posted

技术标签:

【中文标题】mysql.connector.errors.ProgrammingError: 1064 (4200): 你的 SQL 语法有错误;【英文标题】:mysql.connector.errors.ProgrammingError: 1064 (4200): You have an error in your SQL syntax; 【发布时间】: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?*** 上的其他类似示例已链接到reserved words、Redundant comas。但是查看这些示例我无法发现明显的错误。

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

【问题讨论】:

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

【讨论】:

我怀疑这是否有帮助,甚至根本有效。为了说服我,请解释它是如何工作的以及为什么它应该解决问题。

以上是关于mysql.connector.errors.ProgrammingError: 1064 (4200): 你的 SQL 语法有错误;的主要内容,如果未能解决你的问题,请参考以下文章