为什么系列中最后一个分组的数据帧没有将数据加载到MySQL?

问题描述 投票:0回答:1

前 3 个分组数据帧完美插入 MySQL。第四个数据帧(或系列中的最后一个)似乎没有插入数据。例如。在 MySQL 中,运行

SELECT COUNT(*) FROM TEMP_2024_05_18;
返回 0 结果,但是对于所有其他临时表,它显示正确的行数。

在此示例中,我有 1 个主数据帧,它根据数据帧中名为 groupBy 的列分为 4 个分组数据帧,其中包含用下划线分隔的日期字符串。

分组数据框名称 行_计数
2024_05_15 1612
2024_05_16 1332
2024_05_17 96
2024_05_18 83

然后,该脚本在 MySQL 中为每个分组数据帧创建临时表,并插入每个 df 中的数据。所有临时表均已完美创建,并且所有表均已完美填充 除了 系列中的最后一个表创建完美(所有列和类型都与其他表匹配),但 MySQL 表中没有数据

我的 Python 脚本执行以下步骤:

  1. 使用名为 groupBy 的分段列将数据帧拆分为分组数据帧(包含日期字符串,例如 2024_05_17)。

  2. 对于每个分组数据框

    在 MySQL 中创建一个具有动态标题的临时表:temp_lookup_2024_05_17,其中日期部分反映分组数据帧的 groupedBy 值。

  3. 对于每个分组数据框

    将每个分组数据框中的行插入到已创建的相应表中。

# Group the DataFrame by 'group_column'
grouped = df.groupby('groupBy')

for group_name, group_data in grouped:      
    # Create temporary table for each dataframe in for statement
    create_temp_table_query = conn_prod.execute(text(f"""CREATE TABLE tmp_lookup_{group_name} as SELECT * FROM staging_lookup limit 0;"""))

    # Insert data from dataframe into temporary table
    group_data.to_sql(f"tmp_lookup_{group_name}", con=conn_prod, if_exists='replace', index=False)

我已经尝试过:

  1. 打印主数据框会按预期显示所有数据

  2. 打印每个分组数据帧的内容显示每个组包含预期的分组数据

    for group_name, group_data in grouped:
                print(group_name)
                print(group_data)
                print()
    
  3. 计算每个分组数据帧中的行数会显示正确的行数。

  4. 在 Python 脚本中计算每个临时表中的行数并将结果打印在屏幕上,从而显示正确的行数。这包括决赛桌。

    # Insert data from dataframe into temporary table group_data.to_sql(f"tmp_lookup_{group_name}", con=conn_prod, if_exists='replace', index=False) # Count rows inserted by select count(*) on each table inserted_count = conn_prod.execute(text(f""" SELECT count(*) FROM tmp_lookup_{group_name}; """)) print('Rows inserted: ' + str(inserted_count.first()[0]))
    正如Python中的

    TEMP_2024_05_18

    表显示表中有83行,我立即跳转到MySQL并对表进行计数,它显示0行。

我还尝试从使用

engine.connect

to_sql
 方法切换到 
mysql.connector
 和光标方法。两者的结果相同。

python mysql pandas dataframe
1个回答
0
投票

答案(按照@furas的建议):缺少.commit()

在将数据帧复制到 mysql 表的 to_sql 命令之后,应该有一个提交命令。

为什么遗漏了这个?这并不是很明显,因为 to_sql 命令嵌入在 for 语句中。这意味着每次执行 for 语句都会有效地运行一次提交,但最后一次执行不会,导致第一个 to_sql 将提交并将结果存储在表中,但最后一个 to_sql 将不会提交,因此更改丢失.

同样,用于计算临时表中记录数的打印语句是正确的,因为这些记录已加载到 mysql 中的表中,但由于没有提交,因此添加的行被删除。

修复:在每个sql语句之后的for循环中添加提交行。

谢谢弗拉斯!

© www.soinside.com 2019 - 2024. All rights reserved.