【问题标题】:python mysql ValueError: Could not process parameterspython mysql ValueError:无法处理参数
【发布时间】:2021-08-22 18:36:24
【问题描述】:

我有一些 python 代码将列添加到表中,然后遍历列表并将每个值添加到列中。它添加列,但不添加任何值。它给了我错误ValueError:无法处理参数,但是当我在mysql控制台中键入相同的命令时,它就可以正常工作了。以下是我的代码的相关部分和错误消息。让我知道是否有任何明显错误。请和谢谢。

mycursor = mydb.cursor()
colname=input()
que="ALTER TABLE timestamps ADD {} TIMESTAMP(6) ".format(colname)
mycursor.execute(que)
print(que)
for i in range(len(res)):    
    val = res[i]
    print(val)
    sql = "INSERT INTO timestamps ({}) VALUES ('{}') ".format(colname,val)
    print(sql)
    mycursor.execute(sql, val)
mydb.commit()
asdf
ALTER TABLE timestamps ADD asdf TIMESTAMP(6) 
2021-05-23 02:32:20.660
INSERT INTO timestamps (asdf) VALUES ('2021-05-23 02:32:20.660') 
Traceback (most recent call last):
  File "upload_onsets.py", line 89, in <module>
    mycursor.execute(sql, val)
  File "/home/ubuntu2004/.local/lib/python3.8/site-packages/mysql/connector/cursor_cext.py", line 257, in execute
    prepared = self._cnx.prepare_for_mysql(params)
  File "/home/ubuntu2004/.local/lib/python3.8/site-packages/mysql/connector/connection_cext.py", line 651, in prepare_for_mysql
    raise ValueError("Could not process parameters")
ValueError: Could not process parameters

【问题讨论】:

  • 学习使用for val in res:而不是for i in range(len(res)):

标签: python mysql


【解决方案1】:

由于您在 cursor.execute() 中提供值,因此您需要在 SQL 中放置一个占位符,而不是将值格式化。

cursor.execute() 的第二个参数应该是一个元组,而不是单个值。

没有必要在循环内分配sql,因为它不会改变。

sql = "INSERT INTO timestamps ({}) VALUES (%s) ".format(colname)
print(sql)
for i in range(len(res)):    
    val = res[i]
    print(val)
    mycursor.execute(sql, (val,))

但是,您可以使用executemany() 而不是循环更有效地执行此操作。

sql = "INSERT INTO timestamps ({}) VALUES (%s) ".format(colname)
vals = [(val,) for val in res]
mycursor.executemany(sql, vals)

这会将所有插入合并到一个带有多个 VALUES 列表的查询中。

【讨论】:

  • 谢谢@Barmar 我尝试了两种方法,但我得到了错误 SQL 语句中没有使用所有参数。我仍然很困惑为什么该命令可以在控制台中运行,但不能在 python 中运行。
  • 在python中你给mycursor.execute()一个额外的参数。这需要 SQL 中的占位符,但您将值直接替换到 SQL 中,而不是占位符。
  • 您是否在(val,) 中包含逗号以使其成为元组?
  • @Barmer,我将您的代码粘贴到我的代码上。我错过了一步吗?
  • 抱歉,让 SQL 方言混淆了。 MySQL 使用%s 作为占位符,? 用于 SQLite。
猜你喜欢
  • 2019-08-06
  • 2020-04-14
  • 2022-12-11
  • 2021-12-26
  • 2021-10-04
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多