Python中Scrapy抓取的数据插入数据库时如何处理外键关联?
请教,scrapy 抓取的数据插入数据库时有外键,该如何插入,
例如: 向 info 表中插入数据,分类想插入到 category 表中,info 表中有 category_id ,这个插入数据时该如何插入,求教谢谢~!
表设计如下:
category 表:
id,
category
info 表:
id,
name,
image,
category_id
Python中Scrapy抓取的数据插入数据库时如何处理外键关联?
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获取外键值。
不要用外键
你们说的不用外键,但是在 info 表里面还是插入 category_id 吗?如果是,那是不是还是按照二楼的做法来,只是显式的外键定义应该取消?
各位老哥用 scrapy 抓取小说网站,写入 mysql,小说里面含有章节 这个是不是得用到外键,如果不用外键 有什么好的处理方式?
前面的意思确实是需要用外键的,只是不在数据库里明确地定义 FK,只是在程序里或者 SQL 脚本里用外键,实际的程序步骤和 提到的是完全一样的,其实你完全可以提前把整个 categoty 表都读到内存 /缓存里,然后用程序来判定该不该写入 2 个表。
fk 并不是必须的,如果你需要,可以用程序里面操作代替外键。 因为其实就是 一个 category_id 的名字而已。
没错 我就是那个意思。
请问在 mysql 中返回 ID 要如何弄呢?


