我正在编写一个python脚本,该脚本从名为octopart的网站访问数据并将该数据插入MySQL表中。最终目标是这样的:


脚本每天运行一次或两次,使用自定义API查询octopart
从octopart收集数据并使用json解析为有用的格式
从数据中选择的标题和值被插入到MySQL表中
(随着脚本继续运行)脚本更新了表中与octopart中的新条目不相等的某些条目,而没有遇到重复的sql错误。


我已经包含了应该在下面执行的代码(4.)。我仍然收到1062重复条目错误。有什么建议吗?

变量:


mylisth:从octopart数据中提取的标头列表
mylistv:与每个标题对应的值的列表
value ['display_value']:每个数据块要添加到mylistv的下一个值

heads = ','.join(str(i) for i in mylisth)

#create string input of %s corresponding to number of entries in mylisth
placelst = ['%s' for i in mylisth]
placestr = ','.join(str(i) for i in placelst)

#add_capacitor -> SQL query line // data_capacitor -> values to be inserted using query line
duplicate_check = ("SELECT * FROM capacitors")
add_capacitor = ("INSERT INTO capacitors ("+heads+") VALUES ("+placestr+")")
replace_capacitor = ("REPLACE INTO capacitors ("+heads+") VALUES ("+placestr+")")
data_capacitor = mylistv

cursor.execute(duplicate_check)
rows = cursor.fetchall()
for row in rows:
    for col in row:
        if col == value['display_value']:
            cursor.execute(replace_capacitor, data_capacitor)
        else:
            cursor.execute(add_capacitor, data_capacitor)
emp_no = cursor.lastrowid

cnx.commit()
time.sleep(1)

最佳答案

也许您应该使用INSERT ... ON DUPLICATE KEY UPDATE。然后,您无需选择和重新处理表的每一行,而只需通过调用cursor.execute插入该数据,并在存在重复键的情况下让MySQL引擎处理更新:

heads = ','.join(str(i) for i in mylisth)
placelst = ['%s' for i in mylisth]
placestr = ','.join(str(i) for i in placelst)

replacestr = ', '.join(['{}=%s'.format(h) for h in mylisth])
sql = """INSERT INTO capacitors ({heads}) VALUES ({placestr})
         ON DUPLICATE KEY UPDATE {replacestr}""".format(
         heads=heads, placestr=placestr,
         replacestr=replacestr)

for data_capacitor in larger_loop:
    args = data_capacitor*2
    cursor.execute(sql, args)

10-06 14:03