微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLAlchemy query.first() 在每次执行新查询函数时查找下一个条目

如何解决SQLAlchemy query.first() 在每次执行新查询函数时查找下一个条目

我在烧瓶中运行一个爬虫蜘蛛,并使用烧瓶 sqlAlchemy 将数据添加到 postgres 数据库。蜘蛛有一个 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 的条目。这些条目中的每一个requisites 表中都有自己的唯一 ID。 我注意到只有在第一次执行 process_item 时才会填充第一条记录。所以我在函数添加print(f"requisite True - {requisite}") 并注意到每次执行查询时都会返回 requisites 表中的下一个条目,而不是第一个条目,尽管我使用了 .first()。为什么会发生这种情况以及如何解决这个问题? 这是每次执行 process_item 时打印的内容

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

这就是 requisites 表的样子

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。