2015-03-30 11 views
6

Ho bisogno di aiuto per farlo funzionare. Ho un pd.DataFrame (df), che ho bisogno di caricare in un database MySQL. Non capisco cosa significa il messaggio di errore e come risolverlo.Pandas Scrivi tabella a MySQL: "impossibile eseguire il rollback"

Qualsiasi aiuto sarà molto apprezzato.

Questo è quello che ho provato:

import MySQLdb 
    from pandas.io import sql 

    #METHOD 1 
    db=MySQLdb.connect(host="***",port=***,user="***",passwd="***",db="***") 
    df.to_sql(con=db, name='forecast', if_exists='replace', flavor='mysql') 
    ##Also tried 
    sql.write_frame(df, con=db, name='forecast', if_exists='replace', flavor='mysql') 

    **DatabaseError**: Execution failed on sql: SHOW TABLES LIKE %s 
    (2006, 'MySQL server has gone away') 
    unable to rollback 


    #METHOD 2: using sqlalchemy 
    from sqlalchemy import create_engine 

    engine = create_engine("mysql+mysqldb://**username***:**passwd**@***host***:3306/**dbname**") 
    conn = engine.raw_connection() 
    df.to_sql(name='demand_forecast_t', con=conn,if_exists='replace', flavor='mysql',index=False, index_label='rowID') 
    conn.close() 

Il messaggio di errore è:

**OperationalError**: DatabaseError: Execution failed on sql: SHOW TABLES LIKE %s 
(2006, 'MySQL server has gone away') unable to rollback 
+0

quale versione di panda stai usando? –

+0

@ Andy "0.16.0" –

+1

Penso di conoscere il problema. Il dataFrame che sto cercando di scrivere è troppo grande per scrivere alla volta. Se prendo un sottoinsieme, il codice sopra funziona. Credo che dovrò scrivere una sorta di iterazione per fare questo lavoro in una sola volta. –

risposta

13

Quando si utilizza SQLAlchemy, si dovrebbe passare il motore e non la connessione grezzo:

engine = create_engine("mysql+mysqldb://...") 
df.to_sql('demand_forecast_t', engine, if_exists='replace', index=False) 

Scrivere su MySQL senza sqlalchemy (quindi specificando flavor='mysql') è deprecato.

Quando il problema è di avere una cornice troppo grande per scrivere contemporaneamente, è possibile utilizzare la parola chiave chunksize (vedere docstring). Es:

df.to_sql('demand_forecast_t', engine, if_exists='replace', chunksize=10000) 
0

Sono stato in grado di risolvere questo problema. Stavo cercando di caricare una tabella di grandi dimensioni in MySQL e come risultato stava ottenendo l'errore. Un semplice ciclo per caricare i dati in blocchi risolve il problema! Mille grazie a tutti quelli che hanno risposto.

+0

Per questo non è necessario un ciclo for. Puoi usare la parola chiave 'chunksize'. – joris

+0

thx! Avrò uno sguardo –

+0

Come leggere sqlalchemy creare parametri del motore da un file di configurazione? Qualche aiuto su questo? – Viv

0

Per me questo è stato fissato utilizzando

MySQLdb.connect("127.0.0.1","root","","db") 

invece di

MySQLdb.connect("localhost","root","","db") 

e poi

df.to_sql('df',sql_cnxn,flavor='mysql',if_exists='replace', chunksize=100) 
0

È possibile scrivere i panda dataframe nella tabella mysql con sapore mysql (con collegamento DBAPI) nei seguenti modi:

step1: installare il modulo MySQLdb - $ sudo apt-get install python-dev libmysqlclient-dev poi $ pip install MySQL-python

Fase 2: stabilire una connessione con mysql import MySQLdb con = MySQLdb.connect("hostname","username","password","databasename")

Fase 3: scrivere panda dataframe nella tabella mysql utilizzando df.to_sql df.to_sql('TableName',con = con,flavor='mysql',if_exists='replace', chunksize=100)

Problemi correlati