前 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 脚本执行以下步骤:
使用名为 groupBy 的分段列将数据帧拆分为分组数据帧(包含日期字符串,例如 2024_05_17)。
对于每个分组数据框
在 MySQL 中创建一个具有动态标题的临时表:temp_lookup_2024_05_17,其中日期部分反映分组数据帧的 groupedBy 值。
对于每个分组数据框
将每个分组数据框中的行插入到已创建的相应表中。
# 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)
我已经尝试过:
打印主数据框会按预期显示所有数据
打印每个分组数据帧的内容显示每个组仅包含预期的分组数据
for group_name, group_data in grouped:
print(group_name)
print(group_data)
print()
计算每个分组数据帧中的行数会显示正确的行数。
在 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
和光标方法。两者的结果相同。
答案(按照@furas的建议):缺少.commit()
在将数据帧复制到 mysql 表的 to_sql 命令之后,应该有一个提交命令。
为什么遗漏了这个?这并不是很明显,因为 to_sql 命令嵌入在 for 语句中。这意味着每次执行 for 语句都会有效地运行一次提交,但最后一次执行不会,导致第一个 to_sql 将提交并将结果存储在表中,但最后一个 to_sql 将不会提交,因此更改丢失.
同样,用于计算临时表中记录数的打印语句是正确的,因为这些记录已加载到 mysql 中的表中,但由于没有提交,因此添加的行被删除。
修复:在每个sql语句之后的for循环中添加提交行。
谢谢弗拉斯!