簡體   English   中英

ProgrammingError: (psycopg2.errors.UndefinedColumn),同時使用 sqlalchemy

[英]ProgrammingError: (psycopg2.errors.UndefinedColumn), while working with sqlalchemy

我無法查詢在 postgres db(本地)上使用 sqlalchemy 創建的表。

雖然我能夠執行並接收查詢結果:

SELECT * FROM olympic_games 

當我嘗試訪問單個列或對表執行任何其他操作時收到錯誤消息:

SELECT games FROM olympic_games

錯誤消息是(從波蘭語翻譯的幾句話):

ProgrammingError: (psycopg2.errors.UndefinedColumn) BŁĄD: 列“游戲”不存在

第 1 行:SELECT 計數(運動)
^
提示:也許你的意思是“olympic_games.Games”。

SQL: SELECT 游戲來自 olympic_games LIMIT 5;]
(此錯誤的背景: http://sqlalche.me/e/f405

它幾乎可以概括為該程序看不到,或者可以訪問特定列,並顯示它不存在。

我嘗試使用table.column格式訪問,但效果不佳。 我還可以通過information_schema.columns查看列名

使用pd.read_csv加載數據 (.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()

本質上,這是 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')

如果Sport是數據框中的標題案例列,則在 Postgres 中翻譯如下:

DROP TABLE IF EXISTS public."olympic_games";

CREATE TABLE public."olympic_games"
(
    ...
    "Sport" varchar(255)
    "Games" varchar(255)
    ...
);

一旦標識符被混合大小寫引用,它必須始終以這種方式引用。 因此, sport"Sport"不同。 請記住在 SQL 中,雙引號實際上不同於在 Python 中可以互換的單引號。

要解決此問題,請考慮將所有 Pandas 列渲染為小寫,因為"games"gamesGamesGAMES相同(但不是"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

嘗試SELECT "games" FROM olympic_games 在某些情況下,PostgreSQL 在列名周圍創建引號。 例如,如果列名包含混合寄存器。 我必須提醒你:PostgreSQL 區分大小寫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM