提问者:小点点

截断表,然后用Python将数据插入MYSQL表中,只插入最后一条记录


每当我运行我的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语句不同吗?把代码里的东西搬来搬去?创建循环?请帮帮忙,谢谢。


共1个答案

匿名用户

您的cursor.execute语句在for循环之后,这就是为什么所有变量都停留在它们最后一次迭代值的原因。您应该首先生成一个列表,然后在该列表上运行for循环以执行插入。