使用Python teradatasql驱动时cursor.execute()与cursor.fetchall()无结果排查
排查teradatasql查询无结果的可能原因
以下是几个常见的排查方向,你可以逐一验证:
日期类型不匹配导致过滤失效
如果event_date是TIMESTAMP类型而非纯DATE,直接用字符串'2024-01-01'匹配会只返回时间部分为00:00:00的记录,而实际数据可能带非零时间。可以改用范围查询或者显式转换:# 范围查询覆盖全天 cursor.execute("SELECT event.event_number FROM event WHERE event.event_date BETWEEN DATE '2024-01-01' AND DATE '2024-01-02'") # 或者将timestamp转成date后匹配 cursor.execute("SELECT event.event_number FROM event WHERE CAST(event.event_date AS DATE) = DATE '2024-01-01'")另外,Teradata推荐用
DATE 'YYYY-MM-DD'的语法显式声明日期,避免隐式转换错误。Schema/表名的隐式匹配问题
虽然连接时指定了database=my_schema,但可能会话的默认schema并未正确切换,或者表实际属于其他schema。可以尝试显式指定完整表路径:cursor.execute("SELECT my_schema.event.event_number FROM my_schema.event WHERE event.event_date='2024-01-01'")另外,如果表名是小写创建的(创建时用了双引号),SQL中也需要用双引号包裹:
cursor.execute("SELECT \"event\".\"event_number\" FROM \"event\" WHERE \"event\".\"event_date\"='2024-01-01'")改用参数化查询避免类型转换问题
硬编码字符串可能触发意外的隐式转换,用参数化查询让驱动自动处理类型映射:cursor.execute("SELECT event.event_number FROM event WHERE event.event_date = ?", ('2024-01-01',))检查事务隔离级别与自动提交
Teradata默认的事务模式可能导致未提交的数据无法被当前会话读取。可以在连接时开启自动提交:with teradatasql.connect(host='tdp.my-company.org', user=my_login, password=my_password, database=my_schema, autocommit=True) as connection: # 后续查询逻辑不变验证SQL在Teradata客户端中执行的结果
把相同的SQL复制到Teradata官方客户端(比如Teradata Studio)执行,确认是否真的返回259条记录——如果客户端也无结果,说明问题出在数据或SQL本身,而非Python驱动。
内容的提问来源于stack exchange,提问作者Emma Bissonnette
相关产品推荐
相关产品推荐

