2015-06-03 96 views
34

嘗試使用to_sql將pandas數據框寫入MySQL表。以前一直使用flavor ='mysql',但是它將在未來貶值,並希望開始過渡到使用SQLAlchemy引擎。使用SQLAlchemy寫入MySQL數據庫,使用SQLAlchemy,to_sql

示例代碼:

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) 

讀取工作正常,但to_sql有一個錯誤:

DatabaseError:執行失敗的SQL 'SELECT名字從SQLITE_MASTER其中type =' 表」 AND名字= ';':字符串格式化過程中的參數數量錯誤

爲什麼它看起來像試圖使用sqlite?什麼是sqlalchemy與mysql連接的正確使用,特別是mysql.connector?

我也嘗試過將引擎作爲連接傳遞,並且給了我一個引用無遊標對象的錯誤。

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

你必須通過發動機本身,而不是原始連接(在未來的SQLAlchemy的連接也將是可能的,但不是原始連接)。你可以看看是否解決了這個問題? – joris

+0

啊,我看到你已經試過:-)你能在這種情況下顯示你得到的錯誤嗎? – joris

+1

使用引擎時:AttributeError:'引擎'對象沒有屬性'遊標' –

回答

46

到位raw_connection的使用引擎()工作:

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) 

這個是昨天給了我以前的錯誤

+0

現在很高興!無論如何,這是要走的路 – joris

+1

順便說一句,你可以接受你自己的答案,表示這是固定的! – joris

+0

如果遇到安裝mysql.connector或者不知道如何安裝的問題,請參閱https:// stackoverflow。com/questions/32754461/how-to-install-mysql-connector-via-pip 他們推薦'pip安裝mysql-connector == 2.1.4'。它也爲我解決了這個問題。 – cheevahagadog

5

或者爲什麼當我試圖不明確,使用pymysql包...

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 - 你能詳細說明一下這段代碼中的[port]/[schema]部分嗎?不完全確定要放在那裏。謝謝! – pshep123

+1

在這裏回答我自己的問題,schema =數據庫。 – pshep123

+0

很高興爲您提供幫助,@ pshep123 – openwonk

0

我知道問題的標題包含單詞SQLAlchemy,但是我在問題和解答中看到需要導入pymysql或mysql.connector,並且也可以在不調用SQLAlchemy的情況下使用pymysql完成這項工作。

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

我認爲這個解決方案雖然沒有使用SQLAlchemy,但可能是好的。

0

使用pymysql和SQLAlchemy的,這個工程的熊貓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. 
""" 
相關問題