mycursor.executemany更新无法按预期工作

时间:2019-01-01 02:36:04

标签: python mysql python-3.x mysql-python

问题:

我有一个Python脚本可以抓取,并在网站上获取2个变量并将其存储在2个列表中。然后,我使用executemany使用一个变量来匹配一个先前存在的行以将另一个变量插入到MySQL数据库中来更新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行

Image

预期结果

第一个变量是名称,这是需要匹配的变量,第二个变量是要更新为行的族。名称完全匹配,并且在运行程序时没有错误,但是所有族值均为空。

不确定要解决此问题的最佳方法是什么,虽然我可以摆弄小提琴,但不确定executemany中的列表?

其他

如果您需要更多信息,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:0)

只需添加:

mydb.commit()

之后

executemany
相关问题