【问题标题】:Scrapy Pipelines - How to create a variable in a SQL query?Scrapy Pipelines - 如何在 SQL 查询中创建变量?
【发布时间】:2019-09-24 22:03:19
【问题描述】:

我正在尝试将我抓取的数据(产品 ID、类别、名称、描述、价格和时间戳)存储在 Microsoft SQL 数据库的两个单独的表中。一个名为products_tb 的表产生productidcategorynamedescription。将数据存储在相应数据库中的 SQL 语句也会创建一个productgroupidproductgroupid 必须用于存储剩余数据,pricetimestamp 在名为 pricefluctuation 的第二个表中。这背后的想法是我有一张包含所有独特产品的表和一张生成所有这些产品的所有价格+时间戳的每日更新的表。然后可以使用productgroupid 对所有价格和时间戳进行分组。

我尝试创建第二个 SQL 语句,但我不知道如何从 SELECT 创建一个变量,以便我可以使用结果插入另一个表。

pipelines.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

items.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

  1. products_tb

    • productgroupid (bigint)
    • productid (int)
    • 类别(nvarchar(100))
    • 名称​​(nvarchar(350))
    • 描述(nvarchar(1000))
  2. pricefluctuation_tb

    • productgroupid (bigint)
    • 价格(浮动)
    • 时间戳(int)

【问题讨论】:

    标签: sql sql-server scrapy pymssql


    【解决方案1】:

    试试这个:

    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。

    【讨论】:

    • 这似乎工作得很好,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多