Select (не все параметры были использованы в инструкции SQL)

#python #mysql #web-scraping #scrapy

#python #mysql #веб-очистка #scrapy

Вопрос:

Привет, у меня возникла проблема с моим кодом, я хотел проверить дублирующийся идентификатор внутри pipeline process_item, если дублирующегося идентификатора нет, я вставлю элементы внутри таблицы

вот мой код

 def process_item(self, item, spider):
    if isinstance(item, GPHM):
        t = (item['hm_title'],)
        rows_affected = self.curr.execute('SELECT 
COUNT(hm_articode) from saleitems_hm WHERE hm_articode=?', t)
        rows_affected = self.curr.rowcount

        if rows_affected > 1:
            global item_countHM 
            item_countHM  = 1
            self.store_db(item)
    return item


def store_db(self, item):
    self.curr.execute("""insert into saleitems_hm values (%s, %s, %s, %s, %s, %s)""", (
            item['1'],
            item['2'],
            item['3'],
            item['4'],
            item['5'],
            item['6']
        ))
    self.conn.commit()
 

Любая идея, пожалуйста?

Ответ №1:

SELECT count(*) FROM TBL WHERE Оператор в SQL возвращает только 1 строку, то есть количество всех строк в результирующем наборе. Теперь просмотрите эту часть кода:

 rows_affected = self.curr.execute('SELECT 
COUNT(hm_articode) from saleitems_hm WHERE hm_articode=?', t)
rows_affected = self.curr.rowcount

if rows_affected > 1:
    global item_countHM 
    item_countHM  = 1
    self.store_db(item)
 

rowcount возвращает заданное количество строк, которое в этом случае будет равно 1 или -1. row_affected никогда не будет больше единицы, и код с условием if никогда не будет выполнен. Вы можете использовать fetchone для получения фактического количества. Проверьте приведенный ниже код:

 r = self.curr.fetchone('SELECT 
COUNT(hm_articode) from saleitems_hm WHERE hm_articode= %s', t)
is_duplicate = r[0] > 1

if not is_duplicate:
    global item_countHM 
    item_countHM  = 1
    self.store_db(item)
 

Обратите внимание, что если условие изменено так, как вы хотите вставить для не повторяющихся записей. Count(*) больше 1 для повторяющихся записей.

Комментарии:

1. Привет @joshi Я попробовал ваш код, и я все еще получаю ошибку self.curr.execute(‘SELECT COUNT(hm_articode) from saleitems_hm WHERE hm_articode=?’, t) mysql.connector.errors . Ошибка программирования: не все параметры были использованы в инструкции SQL

2. попробуйте использовать %s для форматирования строк. Проверьте отредактированный код.