2015-03-30 15 views
6

Potrzebuję pomocy, aby to zadziałało. Mam pd.DataFrame (df), które muszę załadować do bazy danych MySQL. Nie rozumiem, co oznacza komunikat o błędzie i jak go naprawić.Pandy Napisz tabelę do MySQL: "nie można przywrócić"

Każda pomoc będzie bardzo ceniona.

To co próbowałem:

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

Komunikat o błędzie jest:

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

jakiej wersji pandy używasz? –

+0

@ Andy "0.16.0" –

+1

Myślę, że znam problem. DataFrame, którą próbuję napisać, jest zbyt duży, aby pisać na raz. Jeśli wezmę podzbiór, powyższy kod działa. Sądzę, że będę musiał napisać jakąś iterację, aby wykonać tę pracę naraz. –

Odpowiedz

13

Podczas korzystania SQLAlchemy, należy przekazać silnik, a nie surowe połączenie:

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

Zapisywanie do MySQL bez sqlalchemy (czyli z określeniem flavor='mysql') jest przestarzałe.

Gdy problem polega na tym, że masz zbyt dużą ramkę do pisania na raz, możesz użyć słowa kluczowego chunksize (patrz: docstring). Np .:

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

Udało mi się rozwiązać ten problem. Próbowałem załadować duży stół do MySQL, w wyniku czego otrzymałem błąd. Prosta pętla do przesłania danych w porcjach rozwiązała problem! Wielkie dzięki dla wszystkich, którzy odpowiedzieli.

+0

Nie potrzebujesz do tego pętli for. Możesz użyć słowa kluczowego "chunksize". – joris

+0

thx! Będę musiał sprawdzić –

+0

Jak odczytać parametry silnika sqlalchemy z pliku konfiguracyjnego? Jakaś pomoc w tej sprawie? – Viv

0

Dla mnie ta została ustalona przy użyciu

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

zamiast

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

a następnie

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

Możesz napisać pandy dataframe w tabeli mysql używając smak MySQL (z podłączeniem DBAPI) w następujący sposób:

Krok 1: zainstalować moduł MySQLdb - $ sudo apt-get install python-dev libmysqlclient-dev następnie $ pip install MySQL-python

step2: nawiązywanie połączenia z MySQL import MySQLdb con = MySQLdb.connect("hostname","username","password","databasename")

Krok 3: Zapisz pandy dataframe w tabeli mysql przy użyciu df.to_sql df.to_sql('TableName',con = con,flavor='mysql',if_exists='replace', chunksize=100)

Powiązane problemy