По сути, это проблема двойных кавычек идентификаторов столбцов, как указано в PostgreSQL руководстве :
При цитировании идентификатора также учитывается регистр, тогда как без кавычек имена всегда складываются в нижний регистр. Например, идентификаторы FOO, foo и "foo" считаются одинаковыми PostgreSQL, но "Foo" и "FOO" отличаются от этих трех и друг друга.
Когда у любого из ваших столбцов фрейма данных Pandas смешанные регистры, DataFrame.to_sql
сохраняет чувствительность к регистру, создавая столбцы с двойными кавычками на стадии CREATE TABLE
. В частности, приведенный ниже код Python Pandas при использовании replace
df.to_sql(name='olympic_games', con=engine, if_exists='replace', index_label='ID')
переводит, как показано ниже, в Postgres, если Sport
был столбцом с заголовком в фрейме данных:
DROP TABLE IF EXISTS public."olympic_games";
CREATE TABLE public."olympic_games"
(
...
"Sport" varchar(255)
"Games" varchar(255)
...
);
После того как идентификатор указан в смешанном регистре, на него всегда следует ссылаться таким образом. Следовательно, sport
- это не то же самое, что "Sport"
. Помните, что в SQL двойные кавычки на самом деле отличаются от одинарных кавычек, которые могут быть взаимозаменяемыми в Python.
Чтобы исправить, рассмотрите возможность перевода всех ваших столбцов Pandas в нижний регистр, так как "games"
одинаков как games
, Games
или GAMES
(но не "Games"
или "GAMES"
).
df.columns = df.columns.str.lower()
df.to_sql(name='olympic_games', con=engine, if_exists='replace', index_label='ID')
В качестве альтернативы, оставьте как есть и укажите соответственно:
SELECT "Games" FROM olympic_games