Python3.8通过Snowflake连接器插入时间戳触发SQL语法错误怎么办
报错根因
当前写法是把Python的datetime对象直接通过f-string拼入SQL语句,拼接后生成的时间值没有加SQL要求的单引号,最终语句片段类似:
VALUES (12345, 0.78, 2021-04-30 21:54:41.676406)
SQL解析器会将这串内容识别为连字符连接的算术表达式,解析到空格后的21时直接抛出语法错误,和你遇到的unexpected '21'报错完全匹配。
修复方案
方案1:手动格式化时间为SQL兼容的带引号字符串
在拼接SQL前,将datetime对象转换为Snowflake可识别的时间格式,外层补单引号:
# 将datetime转为标准时间字符串,外层补SQL要求的单引号 # 也可使用ct.isoformat(sep=' ')替代strftime,生成的格式一致 ct_sql = "'" + ct.strftime("%Y-%m-%d %H:%M:%S.%f") + "'" insert_query = f'INSERT INTO DATA_LAKE.CUSTOMER.ACT_PREDICTED_PROBABILITIES(ACCOUNT_ID, PREDICTED_PROBABILITY, TIME_PREDICTED) VALUES ({accountId}, {risk_score},{ct_sql});' ctx.cursor().execute(insert_query)
注意:手动字符串拼接的方式存在SQL注入风险,仅适合所有变量完全由本地可信逻辑生成的场景,不建议拼接用户可控的输入值。
方案2(推荐):使用参数化查询
Snowflake Python连接器原生支持参数绑定,可自动识别Python datetime类型并完成到Snowflake TIMESTAMP类型的转换,不需要手动处理引号、格式转义问题,同时可从根本上规避SQL注入风险,示例代码:
insert_query = """ INSERT INTO DATA_LAKE.CUSTOMER.ACT_PREDICTED_PROBABILITIES( ACCOUNT_ID, PREDICTED_PROBABILITY, TIME_PREDICTED ) VALUES (%s, %s, %s) """ # 将变量作为参数传入,不要拼进SQL字符串 ctx.cursor().execute(insert_query, (accountId, risk_score, ct))
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

