Mycursor.executemany UPDATE не работает должным образом

Вопрос:

У меня есть скрипт Python для очистки и веб-сайт, который получает 2 переменные и сохраняет их в 2 списках. Затем я использую executemany для обновления базы данных MySQL, используя одну переменную для сопоставления с ранее существовавшей строкой для вставки другой переменной.

Код:

Скрипт Python

import mysql.connector
from bs4 import BeautifulSoup as soup
from selenium import webdriver
import time, re

mydb = mysql.connector.connect(
  host = "host",
  user = "user",
  passwd = "passwd",
  database = "database"
)

mycursor = mydb.cursor()

d = webdriver.Chrome('D:/Uskompuf/Downloads/chromedriver')
d.get('https://au.pcpartpicker.com/products/cpu/overall-list/#page=1')
def cpus(_source):
  result = soup(_source, 'html.parser').find('ul', {'id':'category_content'}).find_all('li')
  _titles = list(filter(None, [(lambda x:'' if x is None else x.text)(i.find('div', {'class':'title'})) for i in result]))
  data = [list(filter(None, [re.findall('(?<=\().*?(?=\))', c.text) for c in i.find_all('div')])) for i in result]
  return _titles, [a for *_, [a] in filter(None, data)]


_titles, _cpus = cpus(d.page_source)
sql = "UPDATE cpu set family = %s where name = %s"
mycursor.executemany(sql, list(zip(_cpus, _titles)))
print(sql, list(zip(_titles, _cpus)))
_last_page = soup(d.page_source, 'html.parser').find_all('a', {'href':re.compile('#page\=\d+')})[-1].text
for i in range(2, int(_last_page)+1):
   d.get(f'https://au.pcpartpicker.com/products/cpu/overall-list/#page = {i}') 
   time.sleep(3)
   _titles, _cpus = cpus(d.page_source)
   sql = "UPDATE cpu set family = %s where name = %s"
   mycursor.executemany(sql, list(zip(_cpus, _titles)))

mydb.commit()

Код ОБНОВЛЕНИЯ MySQL

sql = "UPDATE cpu set family = %s where name = %s"
mycursor.executemany(sql, list(zip(_cpus, _titles)))

Печать кода ОБНОВЛЕНИЯ MySQL

print(sql, list(zip(_cpus, _titles)))

Вывод на печать кода MySQL UPDATE

UPDATE cpu set family = %s where name = %s [('Pinnacle Ridge', 'AMD Ryzen 5 2600'), ('Coffee Lake-S', 'Intel Core i7-8700K'),...

Первые 2 строки таблицы

Mycursor.executemany UPDATE не работает должным образом

Ожидаемый результат

Первая переменная - это имя, и это переменная, которой необходимо сопоставить, вторая переменная - это семейство, которое необходимо обновить до строки. Имя идеально совпадает, при запуске программы ошибок нет, однако все значения семейства равны нулю.

Не уверен, как лучше всего решить эту проблему, хотя я мог бы сделать скрипку, но не уверен в списке в исполнении?

Другой

Если вам нужна дополнительная информация, дайте мне знать.

Спасибо

Могу я задать вопрос? Есть любое значение имени Pinnacle Ridge. Поскольку я запускал небольшой пример, например cur.executemany("UPDATE test SET col = %s WHERE col = %s", [("a","1"),("b","2")]), он работает хорошо.

KC. 01.01.2019 06:07

Извините, я не уверен, что полностью понимаю значения названия: AMD Ryzen 5 2600, Intel Core i7-8700k и т. д., Семейство Pinnacle Ridge, Coffe-Lake-S. Я не уверен, что порядок неправильный, если да, то как я могу его изменить?

Luke Prior 01.01.2019 06:16

Я думаю, вы должны исправить свой вопрос, что вы напечатали и что вы использовали в исполнении - разные.

KC. 01.01.2019 06:34

Собственно, ваша ситуация меня смутила. Я создал аналогичную таблицу и сначала вставил все значения в _titles. Затем используйте часть вашего кода (перед циклом for), я получил то, что вам нужно, | AMD Ryzen 5 2600 | Pinnacle Ridge | | Intel Core i7-8700K | Coffee Lake-S | | AMD Ryzen 7 2700X | Pinnacle Ridge | | AMD Ryzen 3 2200G | Raven Ridge |

KC. 01.01.2019 06:57

извините, я не уверен, что вы имеете в виду, я пытаюсь добиться, чтобы семьи соответствовали строкам по именам? Вы знаете, что мне нужно изменить в моем коде, чтобы добиться этого?

Luke Prior 01.01.2019 07:16

о, я только что заметил проблему с оператором печати, я обновил его

Luke Prior 01.01.2019 07:24

Хорошо, поэтому я обновил оператор печати и вывод, так что теперь я просто озадачен, почему он не работает?

Luke Prior 01.01.2019 07:26

исправлено см. ниже

Luke Prior 01.01.2019 07:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
8
2 646
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто пришлось добавить:

mydb.commit()

после

executemany

Другие вопросы по теме