Écrire à la base de données MySQL avec pandas en utilisant SQLAlchemy, à sql

essaie d'écrire la base de données pandas à la table MySQL en utilisant to_sql. Précédemment été en utilisant flavor= 'mysql', mais il sera déprécié dans le futur et a voulu commencer la transition à L'aide de moteur SQLAlchemy.

code échantillon:

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 lecture fonctionne bien mais le to_sql a une erreur:

DatabaseError: L'exécution a échoué sur sql' SELECT name FROM sqlite_master WHERE type= 'table' AND name=?;': Mauvais nombre d'arguments lors du formatage de la chaîne de caractères

pourquoi a-t-il l'air d'essayer d'utiliser sqlite? Quelle est l'utilisation correcte d'une connexion sqlalchemy avec mysql et en particulier mysql.connecteur?

j'ai également essayé de passer le moteur en tant que connexion, et cela m'a donné une erreur référençant aucun objet de curseur.

data.to_sql(name='sample_table2', con=engine, if_exists = 'append', index=False)
>>AttributeError: 'Engine' object has no attribute 'cursor'
39
demandé sur AsAP_Sherb 2015-06-04 00:45:10

4 réponses

utilisant le moteur à la place de la connexion brute () travaillée:

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)

pas clair sur la raison pour laquelle quand j'ai essayé cela hier il m'a donné l'erreur plus tôt

53
répondu AsAP_Sherb 2015-06-04 20:56:29

alternativement, utiliser pymysql paquet...

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)
6
répondu openwonk 2017-03-24 18:43:14

utilisant pymysql et sqlalchemy, cela fonctionne pour 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.
"""
2
répondu DougR 2018-03-06 17:02:08

je sais que dans le titre de la question Est inclus le mot SQLAlchemy, cependant je vois dans les questions et les réponses le besoin d'importer pymysql ou mysql.connecteur, et est également possible de faire le travail avec pymysql, withouth appelant 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')

je pense que cette solution pourrait être bon althought il n'est pas en utilisant SQLAlchemy.

0
répondu Rafael Valero 2018-01-05 15:07:48