[英]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.