【问题标题】:Python with mysql query insertion - single parameter带有 mysql 查询插入的 Python - 单个参数
【发布时间】:2018-01-22 07:36:52
【问题描述】:

下面是不工作的代码

#!/usr/bin/python

import urllib
import datetime
import mysql.connector

data['price'] = 100

# Write to database
cnx = mysql.connector.connect(user='user', password='pw', database='db')
cursor = cnx.cursor()

query = ("INSERT INTO records(price) VALUES(%s) ")
cursor.execute(query, (data['price']))

cnx.commit()

cursor.close()
cnx.close()

MySQL有对应的表和列。

  • id (PRIMARY INT AUTO_INCREMENT)
  • 价格(浮动)

没有连接问题。

它给出了以下错误。有什么想法吗?

Traceback(最近一次调用最后一次):文件“./sys-fetchdata.py”,行 22,在 cursor.execute(query, (data['price'])) 文件“/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py”,行 507,在执行中 self._handle_result(self._connection.cmd_query(stmt)) 文件“/usr/lib/python2.7/dist-packages/mysql/connector/connection.py”,行 722,在 cmd_query 结果 = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) 文件 “/usr/lib/python2.7/dist-packages/mysql/connector/connection.py”,行 640,在_handle_result中 raise errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在第 1 行的“%s)”附近使用正确的语法

【问题讨论】:

  • @hiro_protagonist 谢谢。你应该把这个放在答案中。这就是问题的根源。

标签: python mysql insert


【解决方案1】:

MySQLCursor.execute() methodtuple(或dict)作为第二个(params)参数。

在你的情况下:它应该是(data['price'], )(注意额外的逗号;没有它,括号无效)而不是(data['price'])

【讨论】:

  • 谢谢,这是一个奇怪的错误。我花了几个小时才发布这个问题。
  • 我同意:错误消息应该比它提供更多信息......
【解决方案2】:

让我们尝试寻找解决方案:

  1. 不要执行您的查询,而是 mogrify 并打印它。例如:

    query = ("INSERT INTO records(price) VALUES(%s) ")
    query_to_be_executed = cursor.mogrify(query, (data['price']))
    print(query_to_be_executed)
    
  2. 接下来尝试在 bash 或 phpMyAdmin 中手动执行打印的查询并修复它。

  3. 终于在你的python代码中使用了固定查询。

【讨论】:

  • 感谢您的回答。这应该有助于调试过程,但 hiro 指出了问题的确切根源。
  • mogrify 特定于 PostgreSQL 数据库适配器 psycopgMySQL Connector/Python 没有mogrify,所以不能用于本题的上下文。
  • 奥德赛,我不知道。我知道这是一种解决方法,但也许作者可以使用 PostgreSQL 数据库?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2014-07-11
  • 1970-01-01
  • 2013-01-12
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多