to_sql into data python mysql pandas sqlalchemy mysql-connector

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