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.execute
的 values 参数必须是 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 语法有错误;的主要内容,如果未能解决你的问题,请参考以下文章