Il existe une méthode DataFrame.to_sql , mais elle ne fonctionne que pour les bases de données mysql, sqlite et oracle. Je ne peux pas passer à cette méthode postgres connection ou sqlalchemy engine.
la source
Il existe une méthode DataFrame.to_sql , mais elle ne fonctionne que pour les bases de données mysql, sqlite et oracle. Je ne peux pas passer à cette méthode postgres connection ou sqlalchemy engine.
À partir de pandas 0.14 (publié fin mai 2014), postgresql est pris en charge. Le sql
module utilise maintenant sqlalchemy
pour prendre en charge différentes saveurs de base de données. Vous pouvez transmettre un moteur sqlalchemy pour une base de données postgresql (voir la documentation ). Par exemple:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
df.to_sql('table_name', engine)
Vous avez raison de dire que dans les pandas jusqu'à la version 0.13.1, postgresql n'était pas pris en charge. Si vous devez utiliser une version plus ancienne de pandas, voici une version corrigée de pandas.io.sql
: https://gist.github.com/jorisvandenbossche/10841234 .
Je l'ai écrit il y a un certain temps, je ne peux donc pas garantir pleinement que cela fonctionne toujours, mais la base devrait être là). Si vous placez ce fichier dans votre répertoire de travail et que vous l'importez, vous devriez pouvoir faire (où se con
trouve une connexion postgresql):
import sql # the patched version (file is named sql.py)
sql.write_frame(df, 'table_name', con, flavor='postgresql')
Sqlalchemy engine
, puis-je utiliser unePostgres
connexion existante créée à l'aide depsycopg2.connect()
?Option plus rapide:
Le code suivant copiera votre Pandas DF vers postgres DB beaucoup plus rapidement que la méthode df.to_sql et vous n'aurez pas besoin d'un fichier csv intermédiaire pour stocker le df.
Créez un moteur basé sur vos spécifications DB.
Créez une table dans votre base de données postgres qui a le même nombre de colonnes que le Dataframe (df).
Les données dans DF seront insérées dans votre table postgres.
si vous souhaitez remplacer la table, nous pouvons la remplacer par la méthode to_sql normale en utilisant les en-têtes de notre df, puis charger tout le df qui prend beaucoup de temps dans DB.
la source
contents
? Cela devrait-il être celui qui est écritcopy_from()
?contents
variable, tout le reste devrait bien fonctionneroutput.seek(0)
?Solution Pandas 0.24.0+
Dans Pandas 0.24.0, une nouvelle fonctionnalité a été introduite spécialement conçue pour les écritures rapides sur Postgres. Vous pouvez en savoir plus ici: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
la source
method='multi'
option d' ajout est assez rapide. Mais oui, cetteCOPY
méthode est actuellement la méthode la plus rapide.with
écriture dans une mémoire tampon. La dernière partie de l 'with
utilise une instruction SQL et profite de la vitesse de copy_expert pour charger les données en masse. Quelle est la partie médiane qui commence parcolumns =
faire?keys
arguments de lapsql_insert_copy
fonction s'il vous plaît? Comment obtient-il des clés et les clés sont-elles uniquement les noms de colonnes?Table 'XYZ' already exists
. Pour autant que je sache, cela ne devrait pas créer une table, n'est-ce pas?df.to_sql('table_name', engine, if_exists='replace', method=psql_insert_copy)
- cela crée une table dans votre base de données.Voilà comment je l'ai fait.
Cela peut être plus rapide car il utilise
execute_batch
:la source
Pour Python 2.7 et Pandas 0.24.2 et utilisant Psycopg2
Module de connexion Psycopg2
Connectez-vous à la base de données
En supposant que le dataframe soit déjà présent en tant que df
la source