用pandas DataFrame替换mysql数据库表中的行[英] REPLACE rows in mysql database table with pandas DataFrame

本文是小编为大家收集整理的关于用pandas DataFrame替换mysql数据库表中的行的处理方法,想解了用pandas DataFrame替换mysql数据库表中的行的问题怎么解决?用pandas DataFrame替换mysql数据库表中的行问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

Python 版本 - 2.7.6

熊猫版 - 0.17.1

MySQLdb 版本 - 1.2.5

在我的数据库( PRODUCT )中,我有一个表( XML_FEED ).XML_FEED 表很大(数百万条记录)我有一个 pandas.DataFrame() ( PROCESSED_DF ).数据框有数千行.

现在我需要运行它

REPLACE INTO TABLE PRODUCT.XML_FEED
(COL1, COL2, COL3, COL4, COL5),
VALUES (PROCESSED_DF.values)

问题:-

有没有办法在 pandas 中运行 REPLACE INTO TABLE ?我已经检查了 pandas.DataFrame.to_sql() 但这不是我需要的.我不喜欢在 pandas 中阅读 XML_FEED 表,因为它非常大.

推荐答案

直到这个版本 (0.17.1) 我无法在 pandas 中找到任何直接的方法来做到这一点.我报告了相同的功能请求.我在我的项目中使用 MySQLdb 执行了一些查询,然后使用 DataFrame.to_sql(if_exists='append')

假设

1) product_id 是我在 PRODUCT 表中的主键

2) feed_id 是我在 XML_FEED 表中的主键.

简单版

import MySQLdb
import sqlalchemy
import pandas

con = MySQLdb.connect('localhost','root','my_password', 'database_name')
con_str = 'mysql+mysqldb://root:my_password@localhost/database_name'
engine = sqlalchemy.create_engine(con_str) #because I am using mysql
df = pandas.read_sql('SELECT * from PRODUCT', con=engine)
df_product_id = df['product_id']
product_id_str = (str(list(df_product_id.values))).strip('[]')
delete_str = 'DELETE FROM XML_FEED WHERE feed_id IN ({0})'.format(product_id_str)
cur = con.cursor()
cur.execute(delete_str)
con.commit()
df.to_sql('XML_FEED', if_exists='append', con=engine)# you can use flavor='mysql' if you do not want to create sqlalchemy engine but it is depreciated

请注意:-REPLACE [INTO] 语法允许我们将一行 INSERT 插入到表中,除非发生 UNIQUE KEY(包括 PRIMARY KEY)违规,旧行在新 INSERT 之前被删除,因此没有违规.

本文地址:https://www.itbaoku.cn/post/1727908.html