当前位置: 首页 > 知识库问答 >
问题:

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

莫河
2023-03-14

每当我运行我的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个答案

萧自珍
2023-03-14

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

 类似资料:
  • 问题内容: 我一直在看这段代码已有一段时间了,但我看不出问题出在哪里。我已经阅读了整个StackOverflow,但仍然看不到我的错误在哪里。 错误在第13行中,即thats 。我尝试通过http://www.w3schools.com/php/php_mysql_insert.asp帮助自己,但对我没有太大帮助。 问题答案: 警告: 切勿将 w3schools 用于学习目的。他们的教程中有很多错

  • 问题内容: 我在MySQL中用一个表创建了一个数据库: 我尝试使用Java插入记录: 输出似乎成功返回: 但是,当我从MySQL中选择时,插入的记录为空: 为什么插入空白记录? 问题答案: 不,这是行不通的(不适用于真实数据): 更改为: 使用该sql创建一个PreparedStatment,并使用索引插入值:

  • 我试图使用spring rest API并将结果存储到一个临时表中。以下是我的尝试。我对java和spring很陌生,请原谅我的错误。我的staging表名为“greetingsstaging”。我是spring开发的新手,请帮助理解这个问题。我正在使用JPA和spring。 这是主要应用程序。 这是我的服务。 这是存储库界面。 这是我的pojo课。 我收到以下例外。 在类路径资源中定义名称为“请

  • 问题内容: 这是我想做的事情: 当表中有新记录时,我需要通过设置以表示特定(旧)帐户已被编辑来更新where =中的行。 要求 不是 我要操纵 新插入的 列,而是要使用一个 已经存在的 列 但是,我无法更新同一张表: 请提出解决方法 PS:我已经走过了更新表触发器在同一个表更新后,插入到相同的表触发的mysql,更新与后同桌INSERT触发器和表后插入MySQL的触发器与插入和更新,但他们似乎没有

  • 问题内容: 我有一张表格,列出了来自特定网站的评论数量,如下所示: 我还有另一个表,列出了所有站点,例如从1到10 使用以下代码,我可以找出上个月缺少哪些站点条目: 生产: 我希望能够使用一些默认值(即“ 0”)将查询中列出的缺失网站插入到注释表中 问题是,我如何更新/插入表/值? 干杯, 背风处 问题答案:

  • 我需要一个MySQL函数,它可以在下面的SQL指令之后获取最后插入的id(不仅仅是最后一个)的列表: 更清楚地说,我想有这张桌子(我的桌子): 将在INSERT INTO语句之后复制新值,表现在显示如下: 此函数应返回以下列表:33,34,35 我认为一个临时解决方案是获取最后一个插入的id,然后根据复制的行数“手动”创建一个列表33、34、35。 但是我不知道是否存在SQL的本机函数!