Python 版本 - 2.7.6
Pandas 版 - 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
表,因为它非常大。
最佳答案
随着 pandas 0.24.0 的发布,现在有一个 official way通过将自定义插入方法传递给 to_sql
函数来实现此目的。
通过将此可调用函数传递给 to_sql
,我能够实现 REPLACE INTO
的行为:
def mysql_replace_into(table, conn, keys, data_iter):
from sqlalchemy.dialects.mysql import insert
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert
@compiles(Insert)
def replace_string(insert, compiler, **kw):
s = compiler.visit_insert(insert, **kw)
s = s.replace("INSERT INTO", "REPLACE INTO")
return s
data = [dict(zip(keys, row)) for row in data_iter]
conn.execute(table.table.insert(replace_string=""), data)
你会像这样传递它:
df.to_sql(db, if_exists='append', method=mysql_replace_into)
或者,如果您想要 INSERT ... ON DUPLICATE KEY UPDATE ...
的行为,您可以使用这个:
def mysql_replace_into(table, conn, keys, data_iter):
from sqlalchemy.dialects.mysql import insert
data = [dict(zip(keys, row)) for row in data_iter]
stmt = insert(table.table).values(data)
update_stmt = stmt.on_duplicate_key_update(**dict(zip(stmt.inserted.keys(),
stmt.inserted.values())))
conn.execute(update_stmt)
归功于 https://stackoverflow.com/a/11762400/1919794用于编译方法。
关于python - 用 pandas DataFrame 替换 mysql 数据库表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661318/