sql >> Database >  >> RDS >> Mysql

VERVANG rijen in mysql-databasetabel door panda's DataFrame

Met de release van pandas 0.24.0 is er nu een officiële manier om dit te bereiken door een aangepaste invoegmethode door te geven aan de to_sql functie.

Ik kon het gedrag van REPLACE INTO . bereiken door deze callable door te geven aan 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)

Je zou het zo doorgeven:

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

Als alternatief, als u het gedrag van INSERT ... ON DUPLICATE KEY UPDATE ... wilt in plaats daarvan kun je dit gebruiken:

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)

Met dank aan https://stackoverflow.com/a/11762400/1919794 voor de compileermethode.



  1. Kan ik dit oplossen met pure mysql? (aansluiten op '' gescheiden waarden in een kolom)

  2. Aankondiging van repmgr 2.0

  3. Bereken het tijdsverschil tussen twee tijdstempels in mysql

  4. Mysql single query join 3 table en krijg alle resultaten