PostgreSQL查询指定列提示不存在仅select *正常执行问题求助
问题根因
PostgreSQL默认对未加双引号的SQL标识符(列名、表名等)会自动转为小写处理,你导入数据时保留了School_ID这类大小写混合的列名,系统存储的列名是大小写敏感的,因此直接写列名会被转为school_id无法匹配;单引号包裹的内容会被识别为字符串常量,所以只会返回固定的列名字符串。
你之前加双引号仍报错的原因是%sql单行魔法命令会吞掉语句里的双引号,实际发到数据库的请求仍没有双引号,因此无法匹配大小写敏感的列名。
解决方案
方案1:适配现有结构(不改列名)
根据你使用的查询方式选择对应写法:
- 单行
%sql查询:对双引号做转义处理
%sql select count(distinct \"School_ID\") from chicago_schools;
- 多行
%%sql块查询:直接写双引号包裹列名即可
%%sql select count(distinct "School_ID") from chicago_schools;
- SQLAlchemy原生查询:用
text函数包裹语句避免双引号被转义
from sqlalchemy import text result = db.execute(text('select count(distinct "School_ID") from chicago_schools'))
方案2:批量修改列名为小写(推荐,一劳永逸)
直接把所有列名统一改为小写,后续查询无需额外处理,符合PostgreSQL使用习惯:
- 执行批量修改列名的SQL语句:
DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT column_name FROM information_schema.columns WHERE table_name = 'chicago_schools' LOOP EXECUTE format('ALTER TABLE chicago_schools RENAME COLUMN "%I" TO %I', rec.column_name, lower(rec.column_name)); END LOOP; END $$;
- 后续查询直接写小写列名即可,无需加引号:
select count(distinct school_id) from chicago_schools;
内容的提问来源于stack exchange,提问作者Spinach55
相关产品推荐
相关产品推荐

