sql >> Base de Datos >  >> RDS >> Mysql

REEMPLAZAR filas en la tabla de base de datos mysql con pandas DataFrame

Con el lanzamiento de pandas 0.24.0, ahora hay un manera oficial para lograr esto pasando un método de inserción personalizado a to_sql función.

Pude lograr el comportamiento de REPLACE INTO pasando este invocable a to_sql :

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)

Lo pasarías así:

df.to_sql(db, if_exists='append', method=mysql_replace_into)

Alternativamente, si desea el comportamiento de INSERT ... ON DUPLICATE KEY UPDATE ... en su lugar, puedes usar esto:

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)

Créditos a https://stackoverflow.com/a/11762400/1919794 para el método de compilación.