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
相关产品推荐
相关产品推荐

