SQL中如何访问schema下的表内容?Redshift psycopg2连接问题求解
Redshift使用psycopg2查询未指定schema时报UndefinedTable的解决方案
问题原因
你遇到的报错:
UndefinedTable: relation "table_name" does not exist
根因是Redshift默认的schema搜索路径search_path仅包含$user(和当前用户名同名的schema)和public两个内置值,查询时不指定schema前缀,数据库只会在这两个路径下搜索对应表,自定义schema下的表自然找不到。
解决方案
- 方案1:查询时显式指定schema前缀(最稳妥,避免不同schema下同名表冲突)
示例查询语句:SELECT * FROM <your_schema_name>.<your_table_name>;
把尖括号内容替换为实际的schema和表名即可。 - 方案2:临时修改当前会话的搜索路径
建立数据库连接后,先执行一次SET语句修改当前会话的搜索路径,后续查询不需要再加schema前缀:import psycopg2 conn = psycopg2.connect( host="your-redshift-host", port=5439, dbname="your-dbname", user="your-username", password="your-password" ) cur = conn.cursor() # 新增这一行,把常用schema加到搜索路径最前面,多个schema用逗号分隔 cur.execute("SET search_path TO <your_first_schema>, <your_second_schema>, public;") - 方案3:永久修改对应用户的默认搜索路径
如果某个用户固定使用几个schema,可以直接修改用户级的默认搜索路径,后续所有新连接无需再手动执行SET语句,直接在Redshift查询窗口或psycopg2中执行即可:ALTER USER <your_username> SET search_path TO <your_first_schema>, <your_second_schema>, public;
额外排查点
如果指定schema前缀后仍然报相同错误,需要检查连接用户的权限是否足够:
- 首先需要schema的USAGE权限:
GRANT USAGE ON SCHEMA <your_schema_name> TO <your_username>; - 其次需要对应表的SELECT权限:
GRANT SELECT ON ALL TABLES IN SCHEMA <your_schema_name> TO <your_username>; - 如果需要该用户后续可以自动获取该schema下新建表的查询权限,额外执行默认权限配置:
ALTER DEFAULT PRIVILEGES IN SCHEMA <your_schema_name> GRANT SELECT ON TABLES TO <your_username>;
内容的提问来源于stack exchange,提问作者eduardcmp
相关产品推荐
相关产品推荐

