python - Scrapy/Python/MySQL:将附加项目信息保存在单独的表中的最佳方法是什么?
问题描述
我正在使用包含某种 Scrapy 的网站爬网,listings
并将新列表存储在 MySQL 表中。对于每个listing
我想price
在单独的表中添加(当它发生变化时)。
我目前的做法
表listings
:
<id> | guid | title | body | created_at
-------------------------------------
表listing_prices
:
<id> | listing_id | price | created_at
------------------------------------
使用AddListingsToDatabase()
管道保存新列表,然后使用AddPricesToDatabase()
管道将新/更新的价格保存到数据库。
在AddPricesToDatabase()
我正在查询数据库以获取所有带有价格的列表。然后我检查价格是否发生变化并添加/更新价格。因此我需要listing.id
.
到目前为止,这仅适用于在当前抓取之前已经在数据库中的列表。
我的问题
当我想向数据库添加新价格时,我需要数据库中的listing.id
(auto_increment)。当我在AddPricesToDatabase()
管道中查询数据库时,它还没有找到AddListingsToDatabase()
管道新添加的列表。
我的问题
将额外信息保存Item
在单独的表中的最佳方法是什么?
解决方案
如评论中所述,您可以创建一个组合标识符,而不是自动增加您的标识符,例如website_id
+listing_id
它将唯一标识您的记录。
您可以将其存储在单个列中,也可以存储在两个单独的列中并创建一个组合键。
例如:
websites
桌子:
<id> | website_url
------------------
listings
桌子:
<id> | website_id | guid | title | body | created_at
----------------------------------------------------
listing_prices
桌子:
<id> | website_id | listing_id | price | created_at
---------------------------------------------------
在listings
表中,您必须确保 和 的组合id
是website_id
唯一的。
推荐阅读
- angular - 如何在角度步骤之间持久化数据
- symfony - 我可以使用 LiipTestFixturesBundle 从不同的实体管理器加载固定装置吗
- firebase - 从 Firebase 身份验证中删除名字和姓氏字段 - 电子邮件
- rust - 用相同的值替换 Rust 中的变量会产生不同的结果
- java - 使所有 spring-boot @ConfigurationProperties 字段在应用程序启动时都是必需的,而无需注释每个字段
- html - 如何在使用 `grid-auto-flow: column` 时将 `height: auto` 设置为 CSS 网格容器?
- angular - 如何从 let i =index ( from html) 获取 app.ts 中的 i 值?#角度
- node.js - 使用 atom 在 Mac 上保存 node.js 文件的问题
- flutter - 如何制作具有屏幕尺寸的动画?
- html - 容器内文本的对齐方式