ProgrammingError: (psycopg2.errors.UndefinedColumn) при работе с sqlalchemy - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблемы с запросом таблицы, созданной с помощью sqlalchemy на postgres db (local).

Пока я могу выполнить и получить результат запроса с помощью:

SELECT * FROM olympic_games 

Я получаю сообщение об ошибке, когда пытаюсь получить доступ к одному столбцу или выполнить любую другую операцию с таблицей:

SELECT games FROM olympic_games

Сообщение об ошибке (пара предложений, переведенных из Poli sh):

ProgrammingError: (psycopg2.errors.UndefinedColumn) BŁĄD: столбец "игры" не существует

ЛИНИЯ 1: ВЫБЕРИТЕ COUNT (Спорт)
^
ПОДСКАЗКА: возможно, вы означало "olympic_games.Games".

SQL: ВЫБЕРИТЕ игры ИЗ olympic_games LIMIT 5;]
(Справочная информация об ошибке: http://sqlalche.me/e/f405)

Это в значительной степени суммы, которые эта программа не видит или не может получить доступ к указанному столбцу c, и отображает, что его не существует.

Я пытался получить доступ к формату table.column, он также не работал. Я также могу видеть имена столбцов, через information_schema.columns

Данные (.csv) были загружены с pd.read_csv, а затем DataFrame.to_sql. Код ниже, спасибо за помощь!

engine = create_engine('postgresql://:@:/olympic_games')

with open('olympic_athletes_2016_14.csv', 'r') as file:
    df = pd.read_csv(file, index_col='ID')
df.to_sql(name = 'olympic_games', con = engine, if_exists = 'replace', index_label = 'ID')

Обе команды выполнения возвращаются с одинаковой ошибкой:

with engine.connect() as con:
    rs = con.execute("SELECT games FROM olympic_games LIMIT 5;")
    df_fetch = pd.DataFrame(rs.fetchall())
df_fetch2 = engine.execute("""SELECT games FROM olympic_games LIMIT 5;""").fetchall()

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

По сути, это проблема двойных кавычек идентификаторов столбцов, как указано в 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
0 голосов
/ 03 апреля 2020

Попробуйте SELECT "games" FROM olympic_games. В некоторых случаях PostgreSQL создает кавычки вокруг имен столбцов. Например, если имя столбца содержало смешанный регистр. Я должен напомнить вам: PostgreSQL чувствителен к регистру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...