python - Devuelva el marco de datos de Pandas de la consulta PostgreSQL con sqlalchemy
(2)
El mensaje de error le indica que una tabla llamada:
stat_table
no existe (una relación es una tabla en el discurso de postgres). Entonces, por supuesto, no puedes seleccionar filas de él. Verifica tu db luego de ejecutar:
i.to_sql(''Stat_Table'',engine,if_exists=''replace'')
y vea si se creó una tabla con ese nombre en su db.
Cuando uso su declaración leída:
df = pd.read_sql_query(''select * from Stat_Table'',con=engine)
Obtengo los datos de una base de datos postgres, así que no hay nada de malo en ello.
Quiero consultar una base de datos PostgreSQL y devolver el resultado como un marco de datos de Pandas.
Creé una conexión a la base de datos con ''SqlAlchemy'':
from sqlalchemy import create_engine
engine = create_engine(''postgresql://user@localhost:5432/mydb'')
Escribo un marco de datos de Pandas en una tabla de base de datos:
i=pd.read_csv(path)
i.to_sql(''Stat_Table'',engine,if_exists=''replace'')
Según los docs , parece que pd.read_sql_query () debería aceptar un motor SQLAlchemy:
a=pd.read_sql_query(''select * from Stat_Table'',con=engine)
Pero arroja un error:
ProgrammingError: (ProgrammingError) relation "stat_table" does not exist
Estoy usando Pandas versión 0.14.1.
¿Cuál es la forma correcta de hacer esto?
Le muerden los problemas de sensibilidad del caso (en) con PostgreSQL. Si cita el nombre de la tabla en la consulta, funcionará:
df = pd.read_sql_query(''select * from "Stat_Table"'',con=engine)
Pero, personalmente, le aconsejo que siempre use nombres de tablas en minúsculas (y nombres de columnas), también cuando escriba la tabla en la base de datos para evitar tales problemas.
De los documentos de PostgreSQL ( http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS ):
Al citar un identificador también se distingue entre mayúsculas y minúsculas, mientras que los nombres que no aparecen entre comillas siempre se doblan en minúsculas
Para explicar un poco más: ha escrito una tabla con el nombre Stat_Table
en la base de datos (y sqlalchemy citará este nombre, por lo que se escribirá como "Stat_Table" en la base de datos de postgres). Al hacer la consulta ''select * from Stat_Table''
el nombre de la tabla sin comillas se convertirá a stat_table
, y así obtendrá el mensaje de que no se encuentra esta tabla.
Ver, por ejemplo, también, ¿Los nombres de columnas de PostgreSQL distinguen entre mayúsculas y minúsculas?