Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scrapy插入数据库失败,没有错误_Python_Sqlite_Sqlalchemy_Scrapy - Fatal编程技术网

Python 使用scrapy插入数据库失败,没有错误

Python 使用scrapy插入数据库失败,没有错误,python,sqlite,sqlalchemy,scrapy,Python,Sqlite,Sqlalchemy,Scrapy,我正在使用scrapy和dataset(),它是sqlalchemy之上的一个层,尝试将数据加载到sqllite表中,作为后续操作 使用数据集包,我有: class DynamicSQLlitePipeline(object): def __init__(self,table_name): db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db" db = dataset.connect(db_

我正在使用scrapy和dataset(),它是sqlalchemy之上的一个层,尝试将数据加载到sqllite表中,作为后续操作

使用数据集包,我有:

class DynamicSQLlitePipeline(object):

    def __init__(self,table_name):

        db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
        db = dataset.connect(db_path)
        self.table = db[table_name].table


    def process_item(self, item, spider):

        try:
            print('TEST DATASET..')
            self.table.insert(dict(name='John Doe', age=46, country='China'))
            print('INSERTED')
        except IntegrityError:
                print('THIS IS A DUP')
        return item

运行spider后,我看到打印语句在try-except块中打印出来,没有错误,但完成后,我查看表格并看到屏幕截图。表中没有数据。我做错了什么?

可能是数据库连接有问题。将此代码段放入“尝试”中,以检查问题

try:
   db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
   db = dataset.connect(db_path)
   self.table = db[table_name].table
except Exception:
   traceback.exec_print()

您发布的代码对我无效:

TypeError: __init__() takes exactly 2 arguments (1 given)
这是因为
\uuuu init\uuuu
方法需要一个未被传递的
表名
参数。您需要在管道对象中实现
from_crawler
类方法,类似于:

@classmethod
def from_crawler(cls, crawler):
    return cls(table_name=crawler.spider.name)
这将使用spider名称作为表名创建管道对象,当然,您可以使用任何您想要的名称

此外,行
self.table=db[table\u name]。table
应替换为
self.table=db[table\u name]
()

然后,存储数据:

谢谢您看这个。试过了,没有错误。还向代码中添加了print(db.tables),正确的表按预期打印在一个列表中,因此看起来连接正常。谢谢,为了简化它,我从代码中删除了@classmethod。很抱歉非常感谢。顺便问一下,您使用的是什么db gui?实际上,@classmethod decorator是必需的,因为from_crawler方法是作为类方法调用的:-)至于gui,谢谢。我可以再问一个问题吗:如果传递给insert命令的dict是无序的,那么是否可以设置字段的顺序?