2015-06-03 15 views
34

cercando di scrivere il dataframe dei panda sulla tabella MySQL usando to_sql. In precedenza utilizzava flavor = 'mysql', tuttavia in futuro verrà ammortizzato e si desidera avviare la transizione all'utilizzo del motore SQLAlchemy.Scrittura nel database MySQL con i panda utilizzando SQLAlchemy, to_sql

codice

di esempio:

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

engine = create_engine('mysql+mysqlconnector://[user]:[pass]@[host]:[port]/[schema]', echo=False) 
cnx = engine.raw_connection() 
data = pd.read_sql('SELECT * FROM sample_table', cnx) 
data.to_sql(name='sample_table2', con=cnx, if_exists = 'append', index=False) 

La lettura funziona bene, ma il to_sql ha un errore:

DatabaseError: Esecuzione non riuscita su SQL 'SELECT Nome FROM sqlite_master dove tipo =' table' e name = ?; ': Numero errato di argomenti durante la formattazione delle stringhe

Perché sembra che stia cercando di usare sqlite? Qual è l'uso corretto di una connessione sqlalchemy con mysql e in particolare mysql.connector?

Ho anche provato a passare il motore come connessione, e questo mi ha dato un errore in riferimento a nessun oggetto cursore.

data.to_sql(name='sample_table2', con=engine, if_exists = 'append', index=False) 
>>AttributeError: 'Engine' object has no attribute 'cursor' 
+0

Devi passare il motore stesso, non una connessione prima (in futuro una connessione sqlalchemy sarà anche possibile, ma non un connessione raw). Puoi vedere se questo risolve il problema? – joris

+0

Ah, vedo che l'hai già provato :-) Puoi mostrare l'errore che ottieni in quel caso? – joris

+1

quando si utilizza engine: AttributeError: l'oggetto 'Engine' non ha attributo 'cursor' –

risposta

46

Utilizzando il motore al posto del raw_connection() ha lavorato:

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

engine = create_engine('mysql+mysqlconnector://[user]:[pass]@[host]:[port]/[schema]', echo=False) 
data.to_sql(name='sample_table2', con=engine, if_exists = 'append', index=False) 

non è chiaro il motivo per cui quando ho provato ieri mi ha dato l'errore precedente

+0

Felice che funzioni ora! In ogni caso, questa è la strada da percorrere – joris

+1

BTW, puoi accettare la tua risposta per indicare che questo problema è stato risolto! – joris

+0

In caso di problemi durante l'installazione di 'mysql.connector' o se non si sa come installarlo, consultare questo link https: // stackoverflow.it/questions/32754461/how-to-install-mysql-connector-via-pip Raccomandano 'pip install mysql-connector == 2.1.4'. Ha anche risolto questo problema per me. – cheevahagadog

5

In alternativa, utilizzare pymysql pacchetto ...

import pymysql 
from sqlalchemy import create_engine 
cnx = create_engine('mysql+pymysql://[user]:[pass]@[host]:[port]/[schema]', echo=False) 

data = pd.read_sql('SELECT * FROM sample_table', cnx) 
data.to_sql(name='sample_table2', con=cnx, if_exists = 'append', index=False) 
+1

openwonk - puoi approfondire la parte '[port]/[schema]' di questo codice? Non esattamente sicuro di cosa mettere lì. Grazie! – pshep123

+1

Devo rispondere alla mia domanda qui, schema = base dati. – pshep123

+0

Felice di aiutare, @ pshep123 – openwonk

0

so nel titolo della domanda è inclusa la parola SQLAlchemy, tuttavia vedo nelle domande e risposte la necessità di importare pymysql o mysql.connector, ed è anche possibile fare il lavoro con pymysql, senza chiamare SQLAlchemy.

import pymysql 
user = 'root' 
passw = 'my-secret-pw-for-mysql-12ud' # In previous posts variable "pass" 
host = '172.17.0.2' 
port = 3306 

database = 'sample_table' # In previous posts similar to "schema" 

conn = pymysql.connect(host=host, 
         port=port, 
         user=user, 
         passwd=passw, 
         db=database) 

data.to_sql(name=database, con=conn, if_exists = 'append', index=False, flavor = 'mysql') 

Penso che questa soluzione potrebbe essere buona anche se non sta usando SQLAlchemy.

0

Utilizzando pymysql e SQLAlchemy, questo funziona per Pandas v0.22:

import pandas as pd 
import pymysql 
from sqlalchemy import create_engine 

user = 'yourUserName' 
passw = 'password' 
host = 'hostName' # either localhost or ip e.g. '172.17.0.2' or hostname address 
port = 3306 
database = 'dataBaseName' 

mydb = create_engine('mysql+pymysql://' + user + ':' + passw + '@' + host + ':' + str(port) + '/' + database , echo=False) 

directory = r'directoryLocation' # path of csv file 
csvFileName = 'something.csv' 

df = pd.read_csv(os.path.join(directory, csvFileName)) 

df.to_sql(name=csvFileName[:-4], con=mydb, if_exists = 'replace', index=False) 

""" 
if_exists: {'fail', 'replace', 'append'}, default 'fail' 
    fail: If table exists, do nothing. 
    replace: If table exists, drop it, recreate it, and insert data. 
    append: If table exists, insert data. Create if does not exist. 
"""