web-dev-qa-db-fra.com

Retour Pandas dataframe à partir d'une requête PostgreSQL avec sqlalchemy

Je souhaite interroger une base de données PostgreSQL et renvoyer la sortie sous la forme d'un Pandas dataframe.

J'ai créé une connexion à la base de données avec 'SqlAlchemy':

from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')

J'écris un Pandas dataframe dans une table de base de données:

i=pd.read_csv(path)
i.to_sql('Stat_Table',engine,if_exists='replace')

Basé sur le docs , il ressemble à pd.read_sql_query () devrait accepter un moteur SQLAlchemy:

a=pd.read_sql_query('select * from Stat_Table',con=engine)

Mais cela jette une erreur:

ProgrammingError: (ProgrammingError) relation "stat_table" does not exist

J'utilise Pandas version 0.14.1.

Quelle est la bonne façon de faire cela?

50
lmart999

Vous êtes piqué par les problèmes de sensibilité à la casse avec PostgreSQL. Si vous citez le nom de la table dans la requête, cela fonctionnera:

df = pd.read_sql_query('select * from "Stat_Table"',con=engine)

Mais personnellement, je vous conseillerais de toujours utiliser des noms de table en minuscule (et des noms de colonne), également lors de l'écriture de la table dans la base de données pour éviter de tels problèmes.


À partir des documents PostgreSQL ( http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS ):

Citer un identifiant le rend également sensible à la casse, alors que les noms non cités sont toujours pliés en minuscules

Pour expliquer un peu plus: vous avez écrit un tableau avec le nom Stat_Table à la base de données (et sqlalchemy citera ce nom, il sera donc écrit sous la forme "Stat_Table" dans la base de données postgres). Lorsque vous faites la requête 'select * from Stat_Table' le nom de la table sans guillemets sera converti en minuscule stat_table, et vous obtenez le message que cette table est introuvable.

Voir aussi aussi Les noms de colonnes de PostgreSQL sont-ils sensibles à la casse?

62
joris

Le message d'erreur vous indique qu'une table nommée:

stat_table

n'existe pas (une relation est une table dans postgres speak). Donc, bien sûr, vous ne pouvez pas en sélectionner de lignes. Vérifiez votre base de données après avoir exécuté:

i.to_sql('Stat_Table',engine,if_exists='replace')

et voyez si une table portant ce nom a été créée dans votre base de données.

Quand j'utilise votre déclaration de lecture:

df = pd.read_sql_query('select * from Stat_Table',con=engine)

Je récupère les données d'une base de données postgres, il n'y a donc rien de mal à cela.

2
7stud