Python用DataFrame字段作为IN参数查询Teradata数据库报错如何解决
问题原因
- 占位符语法不兼容:Teradata ODBC驱动不支持
%(params)s这类Python风格的命名参数占位符,仅支持?作为位置占位符,你代码里的%符号被驱动识别为非法SQL字符,直接触发报错。 - IN子句参数处理错误:IN条件对应多个参数值时,需要为每个值单独设置占位符,不能直接把列表/元组当成单个参数传入。
修复方案
import teradata import pandas as pd # 生成参数列表 params = dfm['cust'].astype(str).to_list() # 提前校验参数非空,避免生成IN ()的非法SQL if not params: raise ValueError("过滤参数cust无有效取值") # 构造IN子句的占位符:有多少个参数就生成多少个?,用逗号分隔 in_placeholders = ', '.join(['?'] * len(params)) # 初始化连接 udaExec = teradata.UdaExec(appName="test", version="1.0", logConsole=False) with udaExec.connect(method="ODBC", system=host, username=uid, password=pwd, driver="Teradata Database ODBC Driver 16.20", authentication="LDAP") as connect: # 拼接SQL语句 query = f"SELECT Cust, Flag FROM DBName.Tablename where Cust in ({in_placeholders})" # 执行查询,按位置传递参数即可 df = pd.read_sql(query, connect, params=params)
内容的提问来源于stack exchange,提问作者user2162611
相关产品推荐
相关产品推荐

