Existe o método DataFrame.to_sql , mas funciona apenas para bancos de dados mysql, sqlite e oracle. Não consigo passar para este método de conexão postgres ou motor sqlalchemy.
fonte
Existe o método DataFrame.to_sql , mas funciona apenas para bancos de dados mysql, sqlite e oracle. Não consigo passar para este método de conexão postgres ou motor sqlalchemy.
A partir do pandas 0.14 (lançado no final de maio de 2014), o postgresql é compatível. O sql
módulo agora usa sqlalchemy
para suportar diferentes tipos de banco de dados. Você pode passar um mecanismo sqlalchemy para um banco de dados postgresql (consulte os documentos ). Por exemplo:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Você está correto que nos pandas até a versão 0.13.1 postgresql não era suportado. Se você precisar usar uma versão mais antiga do pandas, aqui está uma versão corrigida de pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234 .
Eu escrevi isso há um tempo atrás, então não posso garantir totalmente que sempre funcione, mas a base deve estar lá). Se você colocar esse arquivo em seu diretório de trabalho e importá-lo, deverá ser capaz de fazer (onde con
está uma conexão postgresql):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine
, posso usar umaPostgres
conexão existente criada usandopsycopg2.connect()
?Opção mais rápida:
O código a seguir copiará seu Pandas DF para o banco de dados postgres muito mais rápido do que o método df.to_sql e você não precisará de nenhum arquivo csv intermediário para armazenar o df.
Crie um motor com base nas especificações do seu banco de dados.
Crie uma tabela em seu banco de dados postgres que tenha o mesmo número de colunas do Dataframe (df).
Os dados no DF serão inseridos em sua tabela postgres.
se você quiser substituir a tabela, podemos substituí-la pelo método to_sql normal usando cabeçalhos de nosso df e, em seguida, carregar todo o df que consome muito tempo no banco de dados.
fonte
contents
faz? Deve ser este o que está escritocopy_from()
?contents
variável, todo o resto deve funcionar bemoutput.seek(0)
?Solução Pandas 0.24.0+
No Pandas 0.24.0 foi introduzido um novo recurso projetado especificamente para gravações rápidas no Postgres. Você pode saber mais sobre isso aqui: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
fonte
method='multi'
opção é rápido o suficiente. Mas sim, esteCOPY
método é o caminho mais rápido agora.with
está escrevendo em um buffer de memória. A última parte dowith
é usar uma instrução SQL e aproveitar a velocidade de copy_expert para carregar os dados em massa. Qual é a parte do meio que começacolumns =
fazendo?keys
argumentos dapsql_insert_copy
função, por favor? Como ele obtém quaisquer chaves e as chaves são apenas os nomes das colunas?Table 'XYZ' already exists
. Pelo que entendi, não deveria criar uma mesa, deveria?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- isso cria uma tabela em seu banco de dados.É assim que eu fiz.
Pode ser mais rápido porque está usando
execute_batch
:fonte
Para Python 2.7 e Pandas 0.24.2 e usando Psycopg2
Módulo de conexão Psycopg2
Conecte-se ao banco de dados
Supondo que o dataframe já esteja presente como df
fonte