You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中因None类型导致条件语句执行异常的问题求助

解决datetime与NoneType比较的TypeError问题

首先,你的报错根源很明确:从Department.Documents表中读取的sent_date字段存在NULL值,当Python通过pyodbc读取SQL的NULL时会将其转换为None,而你直接用这个None和datetime.datetime类型的dr3、dt做大小比较,自然会触发TypeError。

我们来梳理下现有代码里的几个问题:

  • fetch_date()函数只返回了查询结果的第一行,而且没有处理该行sent_date为NULL的情况
  • if sent_date != None:这个判断完全无效,因为sent_date是pyodbc的cursor对象,永远不会等于None,你应该判断的是取出的date_sql或者date_sql[0]是否为None
  • 日期比较的逻辑没有前置判断date_sql[0]是否有效,直接进入比较导致报错

下面是修正后的代码,我添加了详细注释说明改动点:

import pyodbc
from datetime import date, datetime
import dateutil.relativedelta

conn = pyodbc.connect(
    r'DRIVER={SQL Server};'
    r'SERVER=server;'
    r'DATABASE=db;'
)
dt = datetime.today()
dr3 = dt - dateutil.relativedelta.relativedelta(months=3)
cursor = conn.cursor()

# 执行查询并直接获取所有结果,避免后续操作cursor对象的潜在问题
sent_date_results = cursor.execute("""SELECT sent_date, id FROM Department.Documents""").fetchall()

def fetch_date():
    # 如果有查询结果返回第一行,否则返回None
    if sent_date_results:
        return sent_date_results[0]
    return None

date_sql = fetch_date()

# 先判断查询结果存在,且sent_date不为NULL(即Python中的None)
if date_sql is not None and date_sql[0] is not None:
    # 确认sent_date是有效datetime对象后再做区间比较
    if dr3 < date_sql[0] < dt:
        try:
            # SQL的NULL对应Python的None,这里直接传入即可
            cursor.execute("""UPDATE Department.Customer SET name=?, address=?, email=?, phone=?""", 
                          (None, None, None, None))
            cursor.commit()
            print("更新操作执行成功")
        except pyodbc.Error as ex:
            print(f"更新失败:{str(ex)}")
            cursor.rollback()
else:
    print("无有效发送日期数据,跳过更新操作")

# 统一关闭游标和连接,避免资源泄漏
cursor.close()
conn.close()
print("数据库连接已关闭")

额外的优化建议:

  • 如果你的需求是处理Department.Documents中的所有行,而非仅第一行,需要修改逻辑为遍历sent_date_results中的每一行,逐行判断sent_date有效性并执行操作
  • 可以在SQL查询阶段就过滤掉sent_date为NULL的记录,比如SELECT sent_date, id FROM Department.Documents WHERE sent_date IS NOT NULL,从源头减少Python端的None处理逻辑

内容的提问来源于stack exchange,提问作者Niknak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:08