Existe el método DataFrame.to_sql , pero funciona solo para bases de datos mysql, sqlite y oracle. No puedo pasar a este método de conexión postgres o motor sqlalchemy.
fuente
Existe el método DataFrame.to_sql , pero funciona solo para bases de datos mysql, sqlite y oracle. No puedo pasar a este método de conexión postgres o motor sqlalchemy.
A partir de pandas 0.14 (lanzado a finales de mayo de 2014), se admite postgresql. El sqlmódulo ahora se usa sqlalchemypara admitir diferentes tipos de bases de datos. Puede pasar un motor sqlalchemy para una base de datos postgresql (ver documentos ). P.ej:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Tiene razón en que en pandas hasta la versión 0.13.1 postgresql no era compatible. Si necesita usar una versión anterior de pandas, aquí hay una versión parcheada de pandas.io.sql: https://gist.github.com/jorisvandenbossche/10841234 .
Escribí esto hace un tiempo, por lo que no puedo garantizar completamente que siempre funcione, pero la base debería estar ahí). Si coloca ese archivo en su directorio de trabajo y lo importa, entonces debería poder hacer (dónde conestá una conexión postgresql):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine, ¿puedo utilizar unaPostgresconexión existente creada conpsycopg2.connect()?Opción más rápida:
El siguiente código copiará su Pandas DF a postgres DB mucho más rápido que el método df.to_sql y no necesitará ningún archivo csv intermedio para almacenar el df.
Cree un motor basado en las especificaciones de su base de datos.
Cree una tabla en su base de datos de postgres que tenga el mismo número de columnas que el Dataframe (df).
Los datos en DF se insertarán en su tabla de postgres.
si desea reemplazar la tabla, podemos reemplazarla con el método to_sql normal usando encabezados de nuestro df y luego cargar todo el df que consume mucho tiempo en DB.
fuente
contents? ¿Debería ser este el que está escritocopy_from()?contentsvariable, todo lo demás debería funcionar bienoutput.seek(0)?Solución Pandas 0.24.0+
En Pandas 0.24.0 se introdujo una nueva característica diseñada específicamente para escrituras rápidas en Postgres. Puede obtener más información al respecto aquí: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
fuente
method='multi'opciones es lo suficientemente rápido. Pero sí, esteCOPYmétodo es el más rápido en este momento.withescribir en un búfer de memoria. La última parte del procesowithconsiste en utilizar una declaración SQL y aprovechar la velocidad de copy_expert para cargar los datos de forma masiva. ¿Cuál es la parte intermedia que comienza concolumns =hacer?keysargumentos en lapsql_insert_copyfunción por favor? ¿Cómo obtiene las claves y son las claves solo los nombres de las columnas?Table 'XYZ' already exists. Por lo que tengo entendido, no debería crear una tabla, ¿verdad?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)- esto crea una tabla en su base de datos.Así es como lo hice.
Puede ser más rápido porque usa
execute_batch:fuente
Para Python 2.7 y Pandas 0.24.2 y usando Psycopg2
Módulo de conexión Psycopg2
Conectarse a la base de datos
Suponiendo que el marco de datos ya esté presente como df
fuente