每当我运行我的Python代码时,我都希望它在MYSQL中截断表,然后插入所有行。我尝试执行一个TRUNCATE语句,然后执行一个INSERT INTO语句,但代码执行完毕后,我只看到其中的最后一条记录。这就是我的代码看起来的样子。
import pandas as pd
from sodapy import Socrata
import requests
import json
import pymysql
client = Socrata("data.cdc.gov", None)
results = client.get("9mfq-cb36", limit=100)
con = pymysql.connect(host = 'x.x.x.x', user = 'x', passwd = 'xxx', db = 'xxx')
cursor = con.cursor()
# for every column, get the value of the cell as it goes through each row
for val in results:
try:
submission_date = val['submission_date']
except(KeyError):
submission_date = None
try:
state = val['state']
except(KeyError):
state = None
# continues getting vals for each column with try statements
cursor.execute("TRUNCATE TABLE covid19_cases_t")
cursor.execute("INSERT INTO covid19_cases_t (`submission_date`, `state`, `tot_cases`, `conf_cases`, `prob_cases`, `new_case`, `pnew_case`, `tot_death`, `conf_death`, `prob_death`, `new_death`, `pnew_death`, `created_at`, `consent_cases`, `consent_deaths`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (submission_date, state, tot_cases, conf_cases, prob_cases, new_case, pnew_case, tot_death, conf_death, prob_death, new_death, pnew_death, created_at, consent_cases, consent_deaths))
con.commit()
con.close()
我希望它是这样的,一旦我执行了代码,它会截断表中已经存在的任何数据一次,然后再次插入所有行。insert into语句工作得很好,如果没有truncate语句,它将执行所有行。如果这里确实有truncate语句,它会截断Insert Into语句插入的所有记录,但最后一条记录除外。我看到了这个StackOverflow帖子,但它不处理Python。答案建议一次性插入所有语句,而不是一个接一个,但我不知道如何在Python中做到这一点。对于任何有概念性建议的人,请协助编码。
我应该使我的insert语句不同吗?把代码里的东西搬来搬去?创建循环?请帮帮忙,谢谢。
您的cursor.execute语句在for循环之后,这就是为什么所有变量都停留在它们最后一次迭代值的原因。您应该首先生成一个列表,然后在该列表上运行for循环以执行插入。