sql >> Databáze >  >> RDS >> Mysql

REPLACE řádky v mysql databázové tabulce s pandas DataFrame

S vydáním pandy 0.24.0 je nyní k dispozici oficiální cestou abyste toho dosáhli předáním vlastní metody vkládání do to_sql funkce.

Podařilo se mi dosáhnout chování REPLACE INTO předáním tohoto callable do 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)

Přejeli byste to takto:

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

Případně, pokud chcete chování INSERT ... ON DUPLICATE KEY UPDATE ... místo toho můžete použít toto:

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)

Poděkování https://stackoverflow.com/a/11762400/1919794 pro metodu kompilace.



  1. Odevzdejte data v kontejneru mysql

  2. MySQL:#1075 - Nesprávná definice tabulky; autoinkrement vs jiný klíč?

  3. Volání uložené procedury s návratovou hodnotou

  4. Mysql zápas...proti vs. jednoduché jako %term%