[英]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"
與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
嘗試SELECT "games" FROM olympic_games
。 在某些情況下,PostgreSQL 在列名周圍創建引號。 例如,如果列名包含混合寄存器。 我必須提醒你:PostgreSQL 區分大小寫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.