python - into - Escribir en la base de datos MySQL con pandas usando SQLAlchemy, to_sql
pandas to_sql (4)
Alternativamente, use el paquete 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)
tratando de escribir pandas dataframe en la tabla MySQL usando to_sql. Anteriormente utilizaba flavor = ''mysql''; sin embargo, se depreciará en el futuro y desea comenzar la transición al uso del motor SQLAlchemy.
Código de muestra:
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 lectura funciona bien pero el to_sql tiene un error:
DatabaseError: Falló la ejecución en sql ''SELECT nombre FROM sqlite_master WHERE type ='' table ''AND name = ?;'': Número incorrecto de argumentos durante el formateo de cadenas
¿Por qué parece que está tratando de usar sqlite? ¿Cuál es el uso correcto de una conexión sqlalchemy con mysql y específicamente con mysql.connector?
También intenté pasar el motor como la conexión, y eso me dio un error al hacer referencia a ningún objeto de cursor.
data.to_sql(name=''sample_table2'', con=engine, if_exists = ''append'', index=False)
>>AttributeError: ''Engine'' object has no attribute ''cursor''
Sé en el título de la pregunta que se incluye la palabra SQLAlchemy, sin embargo, veo en las preguntas y respuestas la necesidad de importar pymysql o mysql.connector, y también es posible hacer el trabajo con pymysql, sin llamar a 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'')
Creo que esta solución podría ser buena aunque no esté usando SQLAlchemy.
Usando pymysql y sqlalchemy, esto funciona para 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.
"""
Usar el motor en lugar de raw_connection () funcionó:
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)
no está claro por qué cuando probé esto ayer me dio el error anterior