sql - Scrapy Pipelines - 如何在 SQL 查询中创建变量?
问题描述
我正在尝试将抓取的数据(产品 ID、类别、名称、描述、价格和时间戳)存储在 Microsoft SQL 数据库的两个单独的表中。一个名为的表products_tb
产生productid
、category
和。将数据存储在相应数据库中的 SQL 语句也会创建一个. 必须用于存储剩余数据,和在名为 的第二个表中。这背后的想法是,我有一张包含所有独特产品的表和一张生成所有这些产品的所有价格和时间戳的每日更新的表。然后,所有价格和时间戳都可以使用.name
description
productgroupid
productgroupid
price
timestamp
pricefluctuation
productgroupid
我尝试创建第二个 SQL 语句,但我不知道如何从 a 创建一个变量,SELECT
以便我可以使用结果插入另一个表。
管道.py
import pymssql
class KrcPipeline(object):
def __init__(self):
self.conn = pymssql.connect(host='DESKTOP-P1TF28R', user='sa', password='123', database='kaercher')
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
# This part works
sql_statement = f'''
BEGIN
IF NOT EXISTS (SELECT * FROM [kaercher].[dbo].[products_tb]
WHERE productid = {item['productid']})
BEGIN
INSERT INTO [kaercher].[dbo].[products_tb] (productid, category, name, description)
OUTPUT (Inserted.productgroupid)
VALUES ({item['productid']}, '{item['category']}', '{item['name']}', '{item['description']}')
END
END
'''
# This part doesn't work :(
sql_statement2 = f'''
SELECT productgroupid FROM [kaercher].[dbo].[products_tb]
WHERE productid = {item['productid']}
INSERT INTO [kaercher].[dbo].[pricefluctuation_tb] (productgroupid, price, timestamp)
VALUES ( variable for the productgroupid? , {item['price']}, {item['timestamp']})
'''
self.cursor.execute(sql_statement)
self.cursor.execute(sql_statement2)
self.conn.commit()
return item
项目.py
import scrapy
class KrcItem(scrapy.Item):
productid=scrapy.Field()
name=scrapy.Field()
description=scrapy.Field()
price=scrapy.Field()
producttype=scrapy.Field()
timestamp=scrapy.Field()
category=scrapy.Field()
pass
MSSQL 中的数据库结构:
kaercher.db
产品_tb
- productgroupid (大整数)
- 产品编号(整数)
- 类别(nvarchar(100))
- 名称(nvarchar(350))
- 描述(nvarchar(1000))
价格波动_tb
- productgroupid (大整数)
- 价格(浮动)
- 时间戳(整数)
解决方案
试试这个:
sql_statement2 = f'''
DECLARE @productgroupid INT;
SET @productgroupid = (
SELECT productgroupid
FROM [kaercher].[dbo].[products_tb]
WHERE productid = {item['productid']}
);
INSERT INTO [kaercher].[dbo].[pricefluctuation_tb] (productgroupid, price, timestamp)
VALUES ( @productgroupid , {item['price']}, {item['timestamp']})
'''
这假设每个产品 ID 有一个产品组 ID。
推荐阅读
- javascript - RenderItems 未在 return 内定义 no-undef
- html - HTML 视频不播放音频
- java - JSP 编译异常
- python - 用时间序列数据集训练 LSTM 模型后,如何预测未来数据或未知范围的数据?
- django - 如何通过通用 CreateView 建立对象实例化的多对多关系?
- r - 了解 dplyr 管道和汇总功能
- c# - 用种子随机化列表
- node.js - Windows server 2019 和 IIS 10 GET、POST 工作正常但不能使用 PUT、DELETE 从外部
- git - 将 B Git repo Master 替换为另一个 A Git repo master
- iis - IIS Samesite Cookie 适用于 Lax 和 Strict 但不适用于 None