Подтвердить что ты не робот

Вернуться Pandas dataframe из запроса PostgreSQL с sqlalchemy

Я хочу запросить базу данных PostgreSQL и вернуть результат в виде фрейма Pandas.

Я использую sqlalchemy для создания соединения с базой данных:

from sqlalchemy import create_engine
engine = create_engine('postgresql://[email protected]:5432/mydb')

Я пишу DataFrame Pandas в таблицу базы данных:

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

Основываясь на docs, выглядит так: pd.read_sql_query() должен принять механизм SQLAlchemy:

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

Но это вызывает ошибку:

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

Я использую Pandas версию 0.14.1.

Каков правильный способ сделать это?

4b9b3361

Ответ 1

Вас укушают проблемы с чувствительностью к случаю (в) с PostgreSQL. Если вы укажете имя таблицы в запросе, она будет работать:

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

Но лично я бы посоветовал всегда использовать имена таблиц нижних регистров (и имена столбцов), а также при написании таблицы в базе данных для предотвращения таких проблем.


В документах PostgreSQL (http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):

Вычисление идентификатора также делает его чувствительным к регистру, тогда как неупомянутые имена всегда складываются в нижний регистр

Чтобы объяснить немного больше: вы создали таблицу с именем Stat_Table в базу данных (и sqlalchemy укажет это имя, поэтому оно будет записано как "Stat_Table" в базе данных postgres). При выполнении запроса 'select * from Stat_Table' имя без кавычек будет преобразовано в нижний регистр Stat_Table, и вы получите сообщение о том, что эта таблица не найдена.

См. например, также Являются ли имена столбцов PostgreSQL чувствительными к регистру?

Ответ 2

Сообщение об ошибке сообщает вам, что таблица с именем:

stat_table

не существует (отношение является таблицей в postgres). Поэтому, конечно, вы не можете выбирать из него строки. Проверьте свой db после выполнения:

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

и посмотреть, была ли создана таблица с этим именем в вашем db.

Когда я использую ваше выражение для чтения:

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

Я получаю данные обратно из db postgres, поэтому нет ничего плохого в этом.