Scrapy Pipelines - Как создать переменную в запросе SQL? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь сохранить мои очищенные данные (productid, категория, имя, описание, цена и временная метка) в двух отдельных таблицах базы данных Microsoft SQL.Одна таблица с именем products_tb дает productid, category, name и description.Оператор SQL, который хранит данные в этой соответствующей базе данных, также создает productgroupid.productgroupid должен использоваться для хранения оставшихся данных, price и timestamp во второй таблице с именем 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))
    • name (nvarchar (350))
    • описание (nvarchar (1000))
  2. pricefluctuation_tb

    • productgroupid (bigint)
    • цена (с плавающей точкой)
    • отметка времени (int)

1 Ответ

2 голосов
/ 24 сентября 2019

Попробуйте:

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']})

                '''

Предполагается, что для каждого идентификатора продукта имеется один идентификатор группы продуктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...