python - 用 pandas DataFrame 替换 mysql 数据库表中的行

标签 python mysql pandas replace

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/

相关文章:

python - 无法在终端 "bash:/etc/odbcinst.ini: Permission denied"中回显

Python Gunicorn Worker 由于参数不正确而退出?

mysql - 计算具有连接匹配的行

python - 在Python中,使用其他变量的过去创建一个新列

python - 使用另一个分类变量 'share' 绘制 'Day' 列的箱线图

python - 将打印重定向到字符串列表?

python - 使用Python脚本更新MySQL表

MySQL 行到列

mysql - CloudFoundry MySQL Java 配置

python - Pandas :增加日期时间