使用Python将CSV文件导入Snowflake表时PUT命令报错如何解决
报错原因
- PUT是Snowflake客户端命令,仅能通过Snowflake客户端工具(包括官方Python连接器、SnowSQL CLI、Snowpark等)调用,无法在Snowflake Web UI的工作表界面直接执行,这是UI报错的核心原因。
- Python侧执行报错大概率存在两个问题:一是你写的stage命名顺序写反了数据库和模式,Snowflake三层命名规则为
数据库名.模式名.对象名,你写的"SCHEMA"."DATABASE".data_stage顺序错误会导致找不到对应stage;二是如果调用方式错误,没有使用官方Python连接器的原生命令执行逻辑,也会触发报错。
解决步骤
- 首先修正stage命名的顺序错误,将所有引用改为
"你的数据库名"."你的模式名".data_stage,也可以在连接时提前指定库和模式的上下文,后续直接用stage名调用即可。 - 使用Snowflake官方Python连接器执行PUT命令,参考代码如下:
import snowflake.connector # 替换为你自己的连接参数 conn = snowflake.connector.connect( user="你的用户名", password="你的密码", account="你的账户标识符", database="你的数据库名", schema="你的模式名", warehouse="你的仓库名" ) cur = conn.cursor() try: # 执行stage创建相关DDL cur.execute('drop stage if exists data_stage') cur.execute(''' create stage data_stage file_format = (type = "csv" field_delimiter = "," skip_header = 1) ''') # 执行PUT命令,本地路径用原始字符串避免转义问题 put_sql = r"put file://C:/Users/318459/Downloads/Student_marks.csv @data_stage auto_compress=true" cur.execute(put_sql) # 可选:验证文件是否上传成功 cur.execute("list @data_stage") print("上传成功,已上传文件列表:") for file in cur.fetchall(): print(file[0]) finally: cur.close() conn.close()
- 如果你使用Snowpark操作,可直接调用封装好的文件上传接口,代码更简洁:
from snowflake.snowpark import Session # 替换为你自己的连接参数 connection_params = { "account": "你的账户标识符", "user": "你的用户名", "password": "你的密码", "role": "你的角色", "warehouse": "你的仓库名", "database": "你的数据库名", "schema": "你的模式名" } session = Session.builder.configs(connection_params).create() # 直接上传本地文件到stage session.file.put( local_file_name="C:/Users/318459/Downloads/Student_marks.csv", stage_location="@data_stage", auto_compress=True )
- 注意执行Python脚本的设备必须和CSV文件所在设备为同一台,确保路径可以被本地直接访问,不要在远端服务上执行引用本地路径的PUT命令。
内容的提问来源于stack exchange,提问作者Webb
相关产品推荐
相关产品推荐

