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 sql
módulo ahora se usa sqlalchemy
para 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 con
está 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 unaPostgres
conexió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()
?contents
variable, 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í, esteCOPY
método es el más rápido en este momento.with
escribir en un búfer de memoria. La última parte del procesowith
consiste 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?keys
argumentos en lapsql_insert_copy
funció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