You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用df.to_sql()向Snowflake推送DataFrame时遇SQL编译错误

问题:DataFrame推送至Snowflake时出现无效标识符错误

我正在编写代码将DataFrame推送至Snowflake,代码如下:

import pandas as pd
from snowflake.connector.pandas_tools import pd_writer
from sqlalchemy.types import String
from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine

engine = create_engine(URL(
    user='service account',
    password='password',
    account='account',
    database='database',
    schema='schema',
    warehouse='warehouse',
    role="role"
    ))
df.columns = map(lambda x: str(x).upper(), df.columns)

df.to_sql(name=table_name.lower(), con=engine, schema="schema", index=False, if_exists='append', method=pd_writer, dtype={'field': String})

engine.dispose()

但出现如下错误:

snowflake.connector.errors.ProgrammingError: 000904 (42000): SQL compilation error: error line 1 at position 3,361
invalid identifier 'COLUMN_NAME_1234'

该列类型为string,DataFrame包含数百列且所有列值均为string类型,求解决建议。


解决建议
  • 检查目标表列名一致性:确认Snowflake目标表中存在COLUMN_NAME_1234列,且列名的拼写、大小写与DataFrame转换后的列名完全匹配。Snowflake默认将未加双引号的标识符转为大写存储;若目标表列名是通过双引号创建的小写/混合大小写,需将DataFrame列名调整为对应格式。

  • 统一指定所有列的数据类型:当前仅为field列指定String类型,其余列未明确指定可能引发类型推断错误。可遍历所有列生成类型字典:

    dtype = {col: String for col in df.columns}
    

    将该字典传入to_sql的dtype参数中。

  • 处理特殊列名:若COLUMN_NAME_1234包含空格、连字符或Snowflake保留字,需确保列名在SQL中被双引号包裹。可修改列名转换逻辑:

    df.columns = [f'"{str(x).upper()}"' for x in df.columns]
    

    注意此方式要求目标表的对应列名也是通过双引号创建的。

  • 验证DataFrame列名:打印列名列表排查格式问题,比如空格、不可见字符:

    print(df.columns.tolist())
    

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:32:47