拉取Snowflake表到Dataframe时报表不存在或未授权错误如何解决?
Snowflake 表不存在报错解决方案
0. 代码笔误修正
你提供的代码中游标初始化写法错误,首先修正该行:
原错误代码:
cur.con.cursor()
修正后代码:
cur = con.cursor()
该错误会导致游标对象未正确赋值,可能直接引发执行异常。
1. 标识符大小写与特殊字符适配
Snowflake 默认会将 SQL 中无引号包裹的标识符自动转为大写,若你的表/库/schema 名称包含小写字母、混合大小写或空格,会出现匹配失败的情况。
- 解决方案1:SQL 语句中使用全限定名,且给每个标识符加双引号匹配实际大小写:
# 替换为你实际的库、schema、表名,严格匹配大小写和空格 sql = 'select * from "db name"."schema name"."Table"'
- 解决方案2:直接修改 SQL 中的表名与 Snowflake 中实际的大写名称保持一致。
2. 连接上下文校验
你在连接配置中填写的库、schema 可能未生效,可通过以下代码校验当前连接的上下文:
# 执行SQL前先校验当前上下文 cur.execute("SELECT CURRENT_DATABASE(), CURRENT_SCHEMA(), CURRENT_ROLE()") print(cur.fetchone())
如果输出的库、schema 与你预期的不一致,可在执行查询前手动切换:
# 切换到目标库和schema,名称带空格需要加双引号 cur.execute('USE DATABASE "db name"') cur.execute('USE SCHEMA "db name"."schema name"')
3. 权限问题排查
浏览器端登录 Snowflake 使用的角色,可能和 Python 连接默认使用的角色不一致,导致权限不足:
- 若上述校验步骤输出的角色和你浏览器端使用的角色不同,可在连接配置中增加角色参数:
con = snowflake.connector.connect( user = "user.name", authenticator="externalbrowser", warehouse = "ware house name", database = "db name", schema = "schema name", role = "你的角色名" # 新增角色配置,和浏览器端使用的角色保持一致 )
- 若角色一致仍报错,需要联系 Snowflake 管理员给当前角色授予对应表的 SELECT 权限,执行授权语句:
GRANT SELECT ON TABLE "db name"."schema name"."Table" TO ROLE "你的角色名";
内容的提问来源于stack exchange,提问作者jnord
相关产品推荐
相关产品推荐

