Python 错误:参数的类型不受scrapy sql insert支持

Python 错误:参数的类型不受scrapy sql insert支持,python,sql,sqlite,parameters,scrapy,Python,Sql,Sqlite,Parameters,Scrapy,cmd日志显示了该问题。 但我尝试的每一个解决方案都失败了,每一个数据似乎都正常工作 Traceback (most recent call last): File "C:\Users\meow\Anaconda3\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks current.result = callback(current.result, *args, **kw) File "

cmd日志显示了该问题。 但我尝试的每一个解决方案都失败了,每一个数据似乎都正常工作

Traceback (most recent call last):
  File "C:\Users\meow\Anaconda3\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Users\meow\Desktop\hello\hello\pipelines.py", line 27, in process_item
    self.cur.execute(sql.format(col, placeholders), item.values())
ValueError: parameters are of unsupported type
节目详情如下:

它在创建表时工作正常,但根本不插入任何数据

这是我的管道

import sqlite3

class HelloPipeline(object):

    def open_spider(self, spider):#
        self.conn = sqlite3.connect("test.sqlite")
        self.cur = self.conn.cursor()
        self.cur.execute("create table if not exists test(test1 text, test2 text, test3 text,test4 text, test5 text, test6 text, test7 text);")        
        #pass

    def close_spider(self, spider):#
        self.conn.commit()
        self.conn.close()
        #pass

    def process_item(self, item, spider):#

        col = ",".join(item.keys())       
        placeholders = ",".join(len(item) * "?")
        sql = "insert into test({}) values({})"#
        self.cur.execute(sql.format(col, placeholders), item.values())

        return item
这是一个项目

import scrapy


class HelloItem(scrapy.Item):
    # define the fields for your item here like:
    test1 = scrapy.Field()
    ...
    test7 = scrapy.Field()
这是主要节目

class crawler(scrapy.Spider):

...

    def parse (self, response):
        for data_house in jsondata["data"]["data"]:
            yield scrapy.Request(house_detail_domain.format(data_house["post_id"]), self.parse_house_detail)


    def parse_house_detail (self, response):
    ...    

    testitem = HelloItem()

    testitem["test1"] = house_detail.select(".houseInfoTitle")[0].text        
    ...
    testitem["test7"] = house_detail.select(".facility")[0].text
    return testitem
顺便说一句,我也尝试过类似的事情

self.cur.execute(sql.format(col, placeholders), (item.values()))   
#
self.cur.execute(sql.format(col, placeholders), (item.values(),)) 
#    
val = ",".join(item.values())
self.cur.execute(sql.format(col, placeholders), (val))
etc..

请告诉我是否缺少任何信息

问题是
execute
的第二个参数需要一个元组。基本上,您已经从
item.values()
获得了一个数组。要转换为元组,请使用:

self.cur.execute(sql.format(col, placeholders), tuple(item.values()))
您的思路是正确的,但是,例如,您的尝试
(item.values(),)
会生成一个包含单个值的元组,该值是从
values()
返回的整个数组<代码>元组(item.values())将值数组转换为包含每个值作为单个元素的元组


假设您的项目是
{'name1':'value1','name2':'value2'}
。然后
(item.values(),)
是元组
(['value1','value2'])
,即一个元组中有一个包含数组的值。但是
元组(item.values())
('value1','value2')
,也就是说,一个元组包含数组中每个项目的一个值,这是所需要的。

如果您尝试
self.cur.execute(sql.format(col,placeholders),tuple(item.values())
,会发生什么?谢谢!但是为什么
self.cur.execute(sql.format(col,placeholders),(item.values(),)
不使其成为元组呢?
(…,)
创建元组,但不是以您想要的方式。只需打印这三种情况,看看你能得到什么。我明白了,很抱歉,我不太懂编码,甚至不知道在这个SQL请求中它一定是元组(就像我实际尝试了str()b4),谢谢大家