无法使用Scrapy项作为MySQL.execute的数据:“字符串格式化期间的参数数量错误”

时间:2014-09-21 13:05:13

标签: python mysql scrapy mysql-connector-python

我正在使用Scrapy将网站内容解析为Items,复制dict API:

import scrapy

class ScheduleItem(scrapy.Item):
    flight = scrapy.Field()

我正在尝试使用pyformat-style值直接使用上面的Item作为Connector / Python MySQLCursor.execute()语句的数据。然而,它正在崩溃,出现以下错误:

(Pdb) add_schedule_sql()
'INSERT INTO schedules (flight) VALUES (%(flight)s)'

(Pdb) foo = items.ScheduleItem();
(Pdb) foo['flight'] = 'abc'
(Pdb) foo.keys()
['flight']
(Pdb) print foo
{'flight': 'abc'}
(Pdb) self.cursor.execute(add_schedule_sql(), foo)
*** ProgrammingError: Wrong number of arguments during string formatting

在Item中只插入一个值和一个值,两个都有相同的键,所以我对此错误感到困惑。 (Source code here,表示它实际上隐藏了一个TypeError。)如果我使用普通的旧dict,它可以正常工作:

(Pdb) bar = {'flight': 'abc'}
(Pdb) bar.keys()
['flight']
(Pdb) self.cursor.execute(add_schedule_sql(), bar)
(Pdb)

如果我将项目映射到dict,那么调用也可以正常工作:

(Pdb) self.cursor.execute(add_schedule_sql(), dict(item))
(Pdb)

以上很简单,它实际上足以解决我的问题,但我仍然对使用Item的错误感到好奇。 Python 2.7.5,Scrapy 0.24(最新稳定版)。

1 个答案:

答案 0 :(得分:0)

以下适用于我。因此,我们需要查看ScheduleItem的实现,并且还需要所涉及的库的版本号。

In [10]: class ScheduleItem(scrapy.Item):
flight = scrapy.Field()
delay = scrapy.Field()
....:     

In [11]: foo = ScheduleItem()

In [12]: foo['flight'] = 'abc'

In [13]: foo
Out[13]: {'flight': 'abc'}

In [14]: "test %(flight)s str"%(foo)
Out[14]: 'test abc str'

In [15]: "test (flight) and %(flight)s str"%(foo)
Out[15]: 'test (flight) and abc str'