2015-03-30 4 views
6

Ich brauche Hilfe, damit das funktioniert. Ich habe eine pd.DataFrame (df), die ich in eine MySQL-Datenbank laden muss. Ich verstehe nicht, was die Fehlermeldung bedeutet und wie ich sie beheben kann.Pandas Tabelle in MySQL schreiben: "Rollback nicht möglich"

Jede Hilfe wird sehr geschätzt. Diese

ist, was ich versucht:

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() 

Die Fehlermeldung lautet:

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

Welche Pandas Version verwendest du? –

+0

@ Andy "0.16.0" –

+1

Ich denke, ich kenne das Problem. Der Datenrahmen, den ich schreiben möchte, ist zu groß, um auf einmal zu schreiben. Wenn ich eine Teilmenge nehme, funktioniert der obige Code. Ich denke, ich werde eine Art Iteration schreiben müssen, um diese Aufgabe auf einmal zu erledigen. –

Antwort

13

Wenn sqlalchemy verwenden, sollten Sie den Motor und nicht die rohe Verbindung passieren:

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

Das Schreiben in MySQL ohne sqlalchemy (also unter Angabe von flavor='mysql') ist veraltet.

Wenn das Problem darin liegt, dass Sie einen zu großen Rahmen zum Schreiben auf einmal haben, können Sie das Schlüsselwort chunksize verwenden (siehe docstring). ZB:

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

Ich konnte dieses Problem beheben. Ich habe versucht, eine große Tabelle in MySQL zu laden und als Ergebnis davon den Fehler zu bekommen. Eine einfache For-Schleife zum Hochladen von Daten in Blöcken löste das Problem! Vielen Dank an alle, die geantwortet haben.

+0

Sie benötigen dafür keine for-Schleife. Sie können das Schlüsselwort 'chunksize' verwenden. – joris

+0

Danke! Ich werde einen Blick werfen –

+0

Wie zu lesen sqlalchemy Engine-Parameter aus einer Konfigurationsdatei erstellen? Irgendwelche Hilfe dazu? – Viv

0

Das war für mich

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

statt

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

und dann

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

mit fest Sie können Pandas Datenrahmen in MySQL-Tabelle mit mysql Geschmack (mit DBAPI Verbindung schreiben) auf folgende Weise

Schritt 1: mysqldb Modul installieren - $ sudo apt-get install python-dev libmysqlclient-dev dann $ pip install MySQL-python

Schritt 2: eine Verbindung mit mysql import MySQLdb con = MySQLdb.connect("hostname","username","password","databasename")

step3 machen: Pandas in Datenrahmen MySQL-Tabelle schreiben von df.to_sql mit df.to_sql('TableName',con = con,flavor='mysql',if_exists='replace', chunksize=100)