【问题标题】:('The SQL contains 0 parameter markers, but 50 parameters were supplied', 'HY000') or TypeError: 'tuple' object is not callable('SQL 包含 0 个参数标记,但提供了 50 个参数','HY000') 或 TypeError: 'tuple' object is not callable
【发布时间】:2012-03-25 02:34:09
【问题描述】:
import pyodbc,nltk,array
cnxn = pyodbc.connect('Driver={MySQL ODBC 5.1 Driver};Server=127.0.0.1;Port=3306;Database=information_schema;User=root; Password=1234;Option=3;')
cursor = cnxn.cursor()
cursor.execute("use collegedatabase ;")
cursor.execute("select *  from sampledata ; ")
cnxn.commit()
s=[]
j=[]
x=[]
words = []
w = []
sfq = []
POS=[]
for entry in cursor:
        s.append(entry.injury_type),j.append(entry.injury_desc) 


from nltk.tokenize import PunktWordTokenizer
from nltk.corpus import stopwords
tokenizer = PunktWordTokenizer()
english_stops = set(stopwords.words('english'))
for i in range(0,26): # filter stop words
            tokenizer.tokenize(j[i])
            w.append([word for word in tokenizer.tokenize(j[i]) if word not in english_stops])

for a in range(0 , 26):#CONVERTING tokenzied text ito a string 
            sfq.append(" ".join(w[a])) 

from replacers import RegexpReplacer
replacer =  RegexpReplacer()
for a in range (0,26):#POS TAGGING
            replacer.replace(sfq[a])
            POS.append(tokenizer.tokenize(sfq[a]))                
            x.append(nltk.pos_tag(POS[a])) 
            cursor.executemany("update sampledata SET POS = %s where SRNO =%d",(x[a],a))

我得到的错误是:

回溯(最近一次通话最后): 文件“C:\Users\Vaibhav\Dropbox\DUE BY MONDAY\tryingtofixerror.py”,第 35 行,在 cursor.executemany("更新样本数据 SET POS = %s where SRNO =%d",(x[a],a)) ProgrammingError: ('SQL 包含 0 个参数标记,但提供了 50 个参数', 'HY000')

在浏览找到问题的解决方案后,我想用此语句替换最后一行(第 35 行)

cursor.executemany((u'update sampledata SET POS = %s where SRNO =%d'.encode('utf-8'),(x[a],a))(u'MO-MK25'.encode('utf-8'))) 

我不知道我是否朝着正确的方向前进,但是浏览了这么多网站和论坛,我得到了一个提示,可能存在缩进或逗号错误。我不知道还能做什么。顺便说一下,生成的错误代码如下:

回溯(最近一次通话最后): 文件“C:\Users\Vaibhav\Dropbox\DUE BY MONDAY\tryingtofixerror.py”,第 35 行,在 cursor.executemany((u'update sampledata SET POS = %s where SRNO =%d'.encode('utf-8'), (x[a],a)) (u'MO-MK25'.encode(' utf-8'))) TypeError:“元组”对象不可调用

【问题讨论】:

  • 一方面,pyodbc 文档说它使用? 进行参数替换,而不是%s
  • 请对您的问题使用不那么激进的格式,冷静下来,阅读答案,并尝试了解错误的原因。目前,你在盲目猜测,只会让事情变得更糟!
  • 最后一个错误正在发生,因为您可能缺少逗号或错误地调用了 executemany。它似乎试图将(u'update sampledata SET POS = %s where SRNO =%d'.encode('utf-8'), (x[a],a)) 视为可调用对象并将(u'MO-MK25'.encode('utf-8')) 传递给它。这当然不是你想要的。

标签: python mysql


【解决方案1】:

executemany(sql, seq_of_parameters) 方法为一组参数多次执行相同的 SQL 语句。因此,第二个参数seq_of_parameters必须是参数元组的序列,而不仅仅是单个参数元组:

cursor.executemany("update sampledata SET POS = ? where SRNO = ?", [(x[a], a)])

如果您只传递一个元组,光标将假定第一项 x[a] 是一个参数元组。我猜它是一个 50 个字符的字符串,并被解释为 50 个参数的序列,而 SQL 字符串只需要 2 个。

此外,请注意我使用 ? 作为占位符符号而不是 %s,因为 PyODBC 似乎不支持后者,因为它报告说它需要 0 个参数。

在您的情况下,您可能希望在循环中使用 execute() 方法,因为您只想在每次迭代时运行该语句一次:

cursor.execute("update sampledata SET POS = ? where SRNO = ?", (x[a], a))

【讨论】:

  • 我尝试使用您的建议,对我来说,您的建议很有说服力,但生成了以下错误 Traceback(最近一次调用最后一次):文件“C:\Users\Vaibhav\Dropbox\DUE BY MONDAY\tryingtofixerror .py",第 35 行,在 cursor.execute("update sampledata SET POS = ? where SRNO = ?", (x[a], a)) ProgrammingError: ('Invalid parameter type.param-index=0 param-type=list', 'HY105')
  • @VaibhavChauhan:拜托,你可以阅读,对吧?错误消息清楚地表明第一个参数是无效类型list。所以x[a] 似乎是一个列表,但是您的数据库无法将列表存储在表列中。它可能应该是一个整数或字符串。您到底要向数据库中插入什么?
  • 在你的 sql 语句之前,尝试打印出 x[a] 的值并确认它不是一个列表
  • 我要插入的是一个标记化的文本到 MySQL 数据库中;所以你能建议我一种将列表项转换为字符串并仍然停留在最后一个循环中的方法。
  • 我不知道nltk.pos_tag() 会返回什么。如果是字符串列表,您可以将其存储为','.join(x[a]) 返回的逗号分隔字符串,但这实际上取决于您要对数据做什么。
猜你喜欢
  • 2018-10-17
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
相关资源
最近更新 更多