Python Snowflake脚本绑定参数报错:类型不支持等问题求助
问题分析
你遇到的错误主要来自三个方面:
- 错误使用
executemany:你的场景是单次查询,不需要批量执行,executemany用于批量插入/更新,参数格式要求是包含多个参数组的列表,而你嵌套了多层列表[[params]],导致连接器无法识别绑定数据类型。 - 参数结构错误:
- 最初的
params = [[sys.argv[1]]]只包含了第一个参数,且嵌套了两层列表,完全不符合单次查询的参数要求 - 后来的元组写法
(sys.argv[1])不是真正的元组(需要加逗号(sys.argv[1],)),且依然只传入了第一个参数,缺少日期参数:2
- 最初的
- 输入参数的手误:从输出
sys.argv[1:]=['ksisk5kZRvk,', '2022-10-28']可以看到,第一个参数带了多余的逗号,这会导致site_id匹配不到正确数据,即使参数绑定成功也会返回空结果。
解决方案
- 使用
execute而非executemany:针对单次查询,直接调用cursor.execute()即可 - 正确传递参数列表:查询有两个绑定参数
:1和:2,需要传入包含两个元素的列表/元组,直接用sys.argv[1:]就能获取到命令行传入的两个参数(客户ID和日期) - 修正输入命令:确保输入时参数之间用空格分隔,不要加逗号,正确命令为:
myscript.py ksisk5kZRvk 2022-10-28
修正后的核心代码
try: print('Session started...') cs = conn.cursor() print(f"Arguments : {sys.argv[1:]=}") Query = "with dims as (\n" \ " select... " from revenue where site_id = :1 and subscription_product = TRUE and first_or_recurring = 'First'\n" \ " qualify row_number = 1\n" \ "... ")\n" \ "select to_date(:2) as occurred_date, count(distinct srm.subscription_id) as ..." # 直接获取命令行传入的两个参数,作为绑定参数列表 params = sys.argv[1:] # 执行单次查询 cs.execute(Query, params) df = cs.fetch_pandas_all() print(df.head(1)) # 资源清理代码... except Exception as e: print(e) finally: # 资源清理代码... print('Done...')
额外说明
- 可以增加参数数量校验,避免用户输入错误:
if len(sys.argv) != 3: print("请传入两个参数:客户ID和日期") sys.exit(1) - 若确实需要批量执行多组参数,再使用
executemany,此时参数格式应为[['id1', 'date1'], ['id2', 'date2']]
内容的提问来源于stack exchange,提问作者C B
相关产品推荐
相关产品推荐

