#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 для форматирования строк. Проверьте отредактированный код.