2015-06-03 9 views
34

próbuje zapisać pandasową ramkę danych do tabeli MySQL za pomocą to_sql. Poprzednio używałem "smaku" = "mysql", jednak w przyszłości będzie on amortyzowany i chciał rozpocząć przejście do używania silnika SQLAlchemy.Zapisywanie do bazy danych MySQL przy użyciu Pand za pomocą SQLAlchemy, to_sql

kod

próbki:

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) 

Odczyt działa dobrze ale to_sql zawiera błąd:

Databaseerror: Wykonanie nie powiodło się na sql 'SELECT nazwisko FROM sqlite_master GDZIE type =' table”i nazwa = ?; ': Zła liczba argumentów podczas formatowania ciągów znaków

Dlaczego wygląda na to, że próbuje używać sqlite? Jakie jest prawidłowe użycie połączenia sqlalchemy z mysql, a konkretnie mysql.connector?

Próbowałem również przekazać silnik jako połączenie, a to dało mi błąd odwołujący się do obiektu kursora.

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

musiał przejść samego silnika, a nie surowy związek (w przyszłości połączenie sqlalchemy będzie również możliwe, ale nie jest to surowe połączenie). Czy widzisz, czy to rozwiązuje problem? – joris

+0

Ach, widzę, że już to wypróbowałeś :-) Czy możesz pokazać błąd, który dostajesz w takim przypadku? – joris

+1

podczas korzystania z silnika: AttributeError: obiekt "Engine" nie ma atrybutu "kursor" –

Odpowiedz

46

Używanie silnika w miejscu raw_connection() pracował:

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) 

nie jest jasne, dlaczego kiedy próbowałem to wczoraj dał mi wcześniejszy błąd

+0

Cieszę się, że działa teraz! W każdym razie, to jest sposób, aby przejść – joris

+1

BTW, możesz zaakceptować własną odpowiedź na wskazane jest to ustalone! – joris

+0

Jeśli napotkasz problemy z instalacją 'mysql.connector' lub nie wiesz jak ją zainstalować, zobacz ten link https: // stackoverflow.com/questions/32754461/how-to-install-mysql-connector-via-pip Zalecają 'instalacje pip mysql-connector == 2.1.4'. Rozwiązał również ten problem dla mnie. – cheevahagadog

5

Alternatywnie, użyj pymysql pakiet ...

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 - czy możesz rozwinąć część '[port]/[schema]' tego kodu? Nie do końca pewna, co tam umieścić. Dziękuję Ci! – pshep123

+1

Odpowiem tutaj na moje własne pytanie, schemat = baza danych. – pshep123

+0

Cieszę się, że mogę pomóc, @ pshep123 – openwonk

0

Znam w tytule pytania jest zawarte słowo SQLAlchemy, jednak widzę w pytaniach i odpowiedziach potrzebę importowania pymysql lub mysql.connector, a także możliwe jest wykonywanie pracy za pomocą pymysql, withouth calling 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') 

Myślę, że to rozwiązanie może być dobre, mimo że nie używa SQLAlchemy.

0

Korzystanie pymysql i SQLAlchemy to działa dla pand 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. 
""" 
Powiązane problemy