为何Python无法查询Oracle某表但SQL Developer可正常查询?
问题根源与解决方案
这既不是权限问题,也不是Oracle Instant Client安装错误,核心原因是Oracle的标识符大小写敏感性规则:
- Oracle默认会把不带双引号的表名、模式名自动转换为大写存储。但如果创建表时使用了双引号(比如
CREATE TABLE "my_schema"."my_table" (...)),表名会以定义时的精确大小写(这里是小写)存储,查询时必须用双引号包裹才能匹配。 - 你在SQL Developer里用
SELECT * FROM "my_schema"."my_table";能查到,就是因为双引号指定了精确的大小写名称。而Python代码里的SELECT * FROM my_schema.my_table会被Oracle自动转成SELECT * FROM MY_SCHEMA.MY_TABLE,但实际存在的表是小写的my_schema.my_table,自然找不到,触发ORA-00942错误。 - 其他表能正常查询,是因为那些表创建时没加双引号,Oracle自动存为大写,Python里的小写表名转成大写后能匹配到实际表名。
解决方法
修改Python中的SQL语句,给模式名和表名加上双引号即可:
df = pd.read_sql_query('SELECT * FROM "my_schema"."my_table"', engine)
内容的提问来源于stack exchange,提问作者innit
相关产品推荐
相关产品推荐

