使用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
相关产品推荐
相关产品推荐

