Python中Scrapy抓取的数据插入数据库时如何处理外键关联?

请教,scrapy 抓取的数据插入数据库时有外键,该如何插入,
例如: 向 info 表中插入数据,分类想插入到 category 表中,info 表中有 category_id ,这个插入数据时该如何插入,求教谢谢~!
表设计如下:
category 表:
id,
category

info 表:
id,
name,
image,
category_id
Python中Scrapy抓取的数据插入数据库时如何处理外键关联?

11 回复

remove fk


核心思路:pipelines.py 中,先插入主表数据获取其自增ID,再插入关联的从表数据。

关键代码示例:

import pymysql
from itemadapter import ItemAdapter

class DatabasePipeline:
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', password='', database='test')
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        # 1. 插入主表(例如:文章表)
        article_sql = """
            INSERT INTO articles (title, content) 
            VALUES (%s, %s)
        """
        self.cursor.execute(article_sql, (item['title'], item['content']))
        article_id = self.cursor.lastrowid  # 获取刚插入文章的自增ID
        
        # 2. 插入从表(例如:评论表),使用上面获取的article_id作为外键
        for comment in item['comments']:
            comment_sql = """
                INSERT INTO comments (article_id, comment_text) 
                VALUES (%s, %s)
            """
            self.cursor.execute(comment_sql, (article_id, comment))
        
        self.conn.commit()
        return item

    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

补充说明:

  • 确保数据库表已正确定义外键约束
  • 使用事务保证数据一致性(如代码中的commit)
  • 对于多对多关系,需要先插入两端主表,再插入关联表

一句话建议: 按依赖顺序插入,用lastrowid获取外键值。

先插入 category,然后会返回 ID 啊,再拿着这个 id 插入 info

不要用外键

你们说的不用外键,但是在 info 表里面还是插入 category_id 吗?如果是,那是不是还是按照二楼的做法来,只是显式的外键定义应该取消?

各位老哥用 scrapy 抓取小说网站,写入 mysql,小说里面含有章节 这个是不是得用到外键,如果不用外键 有什么好的处理方式?

物理外键取消,用逻辑外键,简单来说就是你的组合在程序里搞定

前面的意思确实是需要用外键的,只是不在数据库里明确地定义 FK,只是在程序里或者 SQL 脚本里用外键,实际的程序步骤和 提到的是完全一样的,其实你完全可以提前把整个 categoty 表都读到内存 /缓存里,然后用程序来判定该不该写入 2 个表。

fk 并不是必须的,如果你需要,可以用程序里面操作代替外键。 因为其实就是 一个 category_id 的名字而已。

没错 我就是那个意思。

请问在 mysql 中返回 ID 要如何弄呢?

回到顶部