Python 使用sqlalchemy和Scrapy更新行
我在sqllite表中有一些数据,我正在使用sqlalchemy与之交互。我试图取一个表行,带有空白字段,为空白字段擦除信息,然后更新行中的字段。我有:Python 使用sqlalchemy和Scrapy更新行,python,sqlalchemy,scrapy,Python,Sqlalchemy,Scrapy,我在sqllite表中有一些数据,我正在使用sqlalchemy与之交互。我试图取一个表行,带有空白字段,为空白字段擦除信息,然后更新行中的字段。我有: engine = create_engine(db_path) Base = declarative_base() # metadata = Base.metadata # Look up the existing tables from database Base.metadata.reflect(engine) def object_a
engine = create_engine(db_path)
Base = declarative_base()
# metadata = Base.metadata
# Look up the existing tables from database
Base.metadata.reflect(engine)
def object_as_dict(obj):
return {c.key: getattr(obj, c.key)
for c in inspect(obj).mapper.column_attrs}
class Get_blank_field_spider(Spider):
def start_requests(self):
source_table= self.source
# NOTE THAT type CREATES A CLASS OF name = source_table
table = type(source_table, (Base,), {"__tablename__": source_table,
"__mapper_args__": {
"primary_key": [Base.metadata.tables[source_table].c.id]}})
Session = sessionmaker(bind=engine)
session = Session()
i = 0
s = session.query(table)
for row in s.limit(300):
i += 1
print object_as_dict(row)
d = object_as_dict(row)
yield Request(url=myurl, headers= headers, callback=self.parse_blank_field_lookup,meta={'d':d, 'cookiejar': i, 'session':s },dont_filter = True)
def parse_blank_field_lookup(self, response):
d = response.meta['d']
i = response.meta['cookiejar']
s = response.meta['session']
try:
blank_field = response.xpath('//PATH GOES HERE').extract_first()
d['blank_field']= blank_field
print d
except:
d['blank_field']= 'not found'
s.filter_by(id=d['id']).update(d)
# s.commit()
如您所见,我试图通过查找正确的行并使用update函数,在使用刮取的数据更新d之后,通过传入字典(d)来通过会话更新整行。这不会更新表本身中的行,尽管不会生成错误。我怎样才能让它工作呢?你有一个
,除了吃东西的错误。。。我的猜测是会话没有通过。但是你在一个类中-你应该改为设置一个类属性。你介意详细说明吗?如果你在except
行中放入raise
,它将抛出错误而不是吃掉它。但更有用的是,元可能会破坏会话。。。相反,您可以只执行self.session=session
,然后在另一个函数引用中执行self.session
…对不起,不起作用。未生成错误,但表行未更新您有一个,除了吃东西错误。。。我的猜测是会话没有通过。但是你在一个类中-你应该改为设置一个类属性。你介意详细说明吗?如果你在except
行中放入raise
,它将抛出错误而不是吃掉它。但更有用的是,元可能会破坏会话。。。相反,您可以只执行self.session=session
,然后在另一个函数引用中执行self.session
…对不起,不起作用。不会生成错误,但不会更新表行