Python 使用sqlalchemy和Scrapy更新行

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

我在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_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
…对不起,不起作用。不会生成错误,但不会更新表行