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

使用mysql-connector与mypy时DATE字段类型检查报错求助

解决mysql-connector与mypy类型检查中DATE字段的类型识别问题

问题背景

使用mysql-connector查询DATE类型字段时,明确返回的是Python date对象,但mypy仍报错提示该字段可能是多种类型(如Decimal、str、bytes等),无法通过类型检查。

解决方案

1. 类型断言(快速解决)

直接通过assert或cast告诉mypy字段的具体类型:

使用assert做类型校验
from datetime import date, datetime
import mysql.connector

today = datetime.now().date()
mysql_cursor = mysql_connection.cursor()
mysql_cursor.execute("select holiday_date from Holidays", {})
rows = mysql_cursor.fetchall()

for row in rows:
    holiday_date = row[0]
    # 断言类型,同时运行时也能做校验
    assert isinstance(holiday_date, date), "holiday_date必须是date对象"
    if holiday_date <= today:
        print(holiday_date)
使用cast做类型提示
from datetime import date, datetime
from typing import cast
import mysql.connector

today = datetime.now().date()
mysql_cursor = mysql_connection.cursor()
mysql_cursor.execute("select holiday_date from Holidays", {})
rows = mysql_cursor.fetchall()

for row in rows:
    # 直接给mypy指定类型
    holiday_date = cast(date, row[0])
    if holiday_date <= today:
        print(holiday_date)

2. 使用字典游标+TypedDict(推荐,类型更严谨)

让游标返回字典格式的结果,结合TypedDict定义行结构,让mypy精确识别字段类型:

from datetime import date, datetime
from typing import TypedDict, List
import mysql.connector

# 定义返回行的类型结构
class HolidayRow(TypedDict):
    holiday_date: date

today = datetime.now().date()
# 使用dictionary=True让游标返回字典
mysql_cursor = mysql_connection.cursor(dictionary=True)
mysql_cursor.execute("select holiday_date from Holidays", {})
# 指定rows的类型
rows: List[HolidayRow] = mysql_cursor.fetchall()

for row in rows:
    holiday_date = row["holiday_date"]
    if holiday_date <= today:
        print(holiday_date)

3. 临时忽略mypy错误(不推荐)

如果不想修改代码结构,可在报错行添加忽略注释,但会掩盖潜在类型问题:

if holiday_date <= today:  # type: ignore[operator]
    print(holiday_date)

问题原因

mysql-connector默认游标返回的fetchall()结果类型为List[Tuple[Any, ...]],mypy无法从数据库元数据中推断字段的具体类型,只能将字段标记为多种可能类型的联合,导致比较操作触发类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:13