Python 使用scrapy插入数据库失败,没有错误
我正在使用scrapy和dataset(),它是sqlalchemy之上的一个层,尝试将数据加载到sqllite表中,作为后续操作 使用数据集包,我有: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_
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是无序的,那么是否可以设置字段的顺序?