Escribiendo en la base de datos MySQL con pandas usando SQLAlchemy, to_sql

tratando de escribir pandas dataframe en la tabla MySQL usando to_sql. Anteriormente, había estado usando flavour = ‘mysql‘, sin embargo, se depreciará en el futuro y quiso iniciar la transición para usar el 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: la ejecución falló en sql ‘SELECT name FROM sqlite_master WHERE type =’ table ‘AND name = ?;’: Número incorrecto de argumentos durante el formato de cadena

¿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 mysql.connector?

También intenté pasar el motor como la conexión, y eso me dio un error al no hacer referencia al objeto del cursor.

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

Utilizando el motor en lugar del raw_connection () trabajado:

 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 tengo claro por qué, cuando probé esto ayer, me dio el error anterior.

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) 

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 eg '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. """ 

Sé que en el título de la pregunta 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.