2016-07-01 23 views
1

Ich möchte die Pandas-Funktion to_sql verwenden, um einen Datenrahmen in eine MariaDB-Datenbank zu schreiben. Mein Python-Code in PyCharm sieht wie folgt aus:Pandas Dataframe zu mariadb Datenbank mit to_sql und sqlalchemy

import pandas as pd 
import mysql.connector 
from sqlalchemy import create_engine 

myd = pd.read_csv('/[path]/[filename].csv') 

engine = create_engine('mysql+mysqlconnector://[user]:[pw]@127.0.0.1/[dbname]') 

myd.to_sql(name='[tablename]', con=engine, if_exists='replace', index=False) 

Wenn die letzte Zeile in der Konsole ausführen ich die folgende Fehlermeldung erhalten:

Error on sql SELECT name FROM sqlite_master WHERE type='table' AND name='[tablename]'; 
Traceback (most recent call last): 
    File "/usr/lib/python3.4/code.py", line 90, in runcode 
    exec(code, self.locals) 
    File "<input>", line 1, in <module> 
    File "/usr/lib/python3/dist-packages/pandas/core/frame.py", line 1261, in to_sql 
    self, name, con, flavor=flavor, if_exists=if_exists, **kwargs) 
    File "/usr/lib/python3/dist-packages/pandas/io/sql.py", line 207, in write_frame 
    exists = table_exists(name, con, flavor) 
    File "/usr/lib/python3/dist-packages/pandas/io/sql.py", line 275, in table_exists 
    return len(tquery(query, con)) > 0 
    File "/usr/lib/python3/dist-packages/pandas/io/sql.py", line 90, in tquery 
    cur = execute(sql, con, cur=cur) 
    File "/usr/lib/python3/dist-packages/pandas/io/sql.py", line 44, in execute 
    cur = con.cursor() 
AttributeError: 'Engine' object has no attribute 'cursor' 

Here jemand an einem Punkt den gleichen Fehler hatte. Es war jedoch verschwunden, bevor jemand das Problem löste. Weißt du was falsch ist?

+0

Normalerweise können Sie diesen Fehler erhalten, wenn Sie eine alte Pandas-Version verwenden (bevor sie sqlalchemy-Engines unterstützt). Können Sie die Ausgabe von 'pd .__ version__' anzeigen? – joris

+0

Das gibt 0,13.1 - Ich muss Pandas aktualisieren, oder? – nluckn

+0

Tatsächlich ist die minimale Version '0.14' dafür. Oder Sie können die rohe Verbindung ('' engine.raw_connection() '') und 'flavour = 'mysql'' übergeben (dies wird jedoch in neueren Versionen nicht mehr unterstützt). – joris

Antwort

2

sqlalchemy Motoren Passing wird nur von Pandas 0.14.0

beginnend unterstützte

to_sql mit älteren Pandas Version verwenden zu können, müssen Sie die rohe Verbindung passieren (engine.raw_connection()) und flavor='mysql'-to_sql:

myd.to_sql(name='[tablename]', con=engine.raw_connection(), flavor='mysql', if_exists='replace', index=False) 

Ich empfehle jedoch, Ihre Pandas-Version zu aktualisieren (das Übergeben von rohen Verbindungen ist veraltet und wird in neueren Pandas-Versionen nicht mehr unterstützt, dann werden nur sqlalchemy-Engines/Verbindungen unterstützt)