Mysql
 sql >> Baza danych >  >> RDS >> Mysql

ZAMIEŃ wiersze w tabeli bazy danych mysql za pomocą pand DataFrame

Wraz z wydaniem pand 0.24.0 istnieje teraz oficjalny sposób aby to osiągnąć, przekazując niestandardową metodę insert do to_sql funkcjonować.

Udało mi się osiągnąć zachowanie REPLACE INTO przekazując to wywoływalne 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)

Przekazałbyś to tak:

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

Alternatywnie, jeśli chcesz, aby zachowanie INSERT ... ON DUPLICATE KEY UPDATE ... zamiast tego możesz użyć tego:

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)

Kredyty dla https://stackoverflow.com/a/11762400/1919794 dla metody kompilacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql łączy się w dwóch tabelach

  2. Jak sprawdzić, czy MySQL zwraca wartość null/puste?

  3. Jak sprawdzić, które e-maile znajdują się na tych samych listach?

  4. błąd:skrypt instalacyjny zakończył działanie z błędem:polecenie 'gcc' nie powiodło się ze statusem wyjścia 1

  5. Błąd w przygotowanym oświadczeniu