首页 > 解决方案 > SQLAlchemy query.first() 在每次执行新时间查询函数时查找下一个条目

问题描述

我在烧瓶中运行一个scrapy spider,并使用flask-SQLAlchemy 将数据添加到postgres db。蜘蛛具有process_item每次从网站收集数据时执行的功能。每次抓取网站时,都会将网站添加到merchants表中并分配一个唯一的 ID。此 id 存储在一个变量中merchant_id,并用作查找requisites表中第一个条目的关系,以更新表的 11 列中的一个。

这是我使用的功能

def process_item(self, item, spider):
    requisite = Requisites.query.filter_by(merchant_id=self.merchant_id).first()
    if requisite:
        print(f"requisite True - {requisite}")
        for key in item:
            exec(f"requisite.{key} = item['{key}']")
            db.session.commit()
    else:
        print(f"requisite False - {requisite}")
        requisite = Requisites(website=self.website, merchant_id=self.merchant_id)
        db.session.add(requisite)
        for key in item:
            exec(f"requisite.{key} = item['{key}']")
            db.session.commit()
    return item

在我的requisites表中,我总共有五个相同的条目merchant_id。这些条目中的每一个在表中都有自己的唯一 ID requisites。我注意到第一条记录仅在第一次process_item执行时才被填充。所以我添加print(f"requisite True - {requisite}")到函数中并注意到每次执行它时,查询都会返回必需表中的下一个条目,而不是第一个条目,尽管我使用了 .first()。为什么会发生这种情况以及如何解决这个问题?这是每次process_item执行时打印的内容:

requisite True - <Requisites 3>
requisite True - <Requisites 4>
requisite True - <Requisites 5>
requisite True - <Requisites 6>

这就是requisites桌子的样子 在此处输入图像描述

标签: pythonpostgresqlsqlalchemy

解决方案


推荐阅读