2015-06-03 21 views
34

cố gắng viết gấu trúc dataframe vào bảng MySQL bằng cách sử dụng to_sql. Trước đây đã được sử dụng flavor = 'mysql', tuy nhiên nó sẽ được khấu hao trong tương lai và muốn bắt đầu quá trình chuyển đổi sang sử dụng công cụ SQLAlchemy.Ghi vào cơ sở dữ liệu MySQL với gấu trúc bằng cách sử dụng SQLAlchemy, to_sql

mẫu mã:

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) 

Các chi hoạt động tốt nhưng to_sql có một lỗi:

DatabaseError: Thực hiện không thành công trên sql 'SELECT tên TỪ sqlite_master ĐÂU type =' bảng' VÀ name = ?; ': Số lượng đối số sai trong khi định dạng chuỗi

Tại sao có vẻ như nó đang cố sử dụng sqlite? Việc sử dụng chính xác kết nối sqlalchemy với mysql và mysql.connector là gì?

Tôi cũng đã thử truyền động cơ ở dạng kết nối, và điều đó đã cho tôi lỗi khi tham chiếu không có đối tượng con trỏ.

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

Bạn phải vượt qua Engine riêng của mình, không phải là một kết nối thô (trong tương lai một kết nối SQLAlchemy cũng sẽ có thể, nhưng không phải là một kết nối thô). Bạn có thể xem liệu điều đó có giải quyết được vấn đề không? – joris

+0

Ah, tôi thấy rằng bạn đã thử rằng :-) Bạn có thể hiển thị lỗi bạn nhận được trong trường hợp đó không? – joris

+1

khi sử dụng động cơ: AttributeError: đối tượng 'Engine' không có thuộc tính 'cursor' –

Trả lời

46

Sử dụng động cơ ở vị trí của raw_connection() làm việc:

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) 

không rõ ràng về lý do tại sao khi tôi đã cố gắng này ngày hôm qua nó đã cho tôi những lỗi trước đó

+0

Vui vì nó hoạt động ngay bây giờ! Trong mọi trường hợp, đây là cách để đi – joris

+1

BTW, bạn có thể chấp nhận câu trả lời của riêng bạn để chỉ ra điều này là cố định! – joris

+0

Trong trường hợp bạn gặp sự cố khi cài đặt 'mysql.connector' hoặc không biết cách cài đặt, hãy xem liên kết https: // stackoverflow này.com/questions/32754461/how-to-install-mysql-connector-via-pip Chúng đề xuất 'pip install mysql-connector == 2.1.4'. Nó cũng giải quyết vấn đề này cho tôi. – cheevahagadog

5

Ngoài ra, sử dụng pymysql gói ...

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 - bạn có thể xây dựng trên phần '[port]/[schema]' của mã này không? Không chắc chắn chính xác những gì để đặt ở đó. Cảm ơn bạn! – pshep123

+1

Gonna trả lời câu hỏi của tôi ở đây, schema = data base. – pshep123

+0

Rất vui được giúp đỡ, @ pshep123 – openwonk

0

Tôi biết trong tiêu đề câu hỏi được bao gồm từ SQLAlchemy, tuy nhiên tôi thấy trong các câu hỏi và trả lời sự cần thiết phải nhập khẩu pymysql hoặc mysql.connector, và cũng có thể thực hiện công việc với pymysql, với tên gọi là SQLAlchemy withouth.

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

Tôi nghĩ giải pháp này có thể tốt mặc dù nó không sử dụng SQLAlchemy.

0

Sử dụng pymysql và SQLAlchemy, điều này làm việc cho 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. 
""" 
Các vấn đề liên quan