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

使用mysql-connector-python执行UPDATE查询触发TypeError问题排查

解决方案:TypeError: 'Field' object is not callable 问题修复

问题根源

你直接将PyPika构建的MySQLQuery对象传给了mysql-connector-python的execute方法,但该方法仅接受字符串类型的SQL语句。连接器尝试对这个Query对象执行encode("utf-8")操作时,触发了类型错误——因为Query对象并非字符串,其内部结构无法被当作可调用对象处理。

修复步骤

1. 将PyPika查询对象转换为字符串

修改fix_directory_lookup_indexes函数中的执行代码,把update_query转换为字符串后再传入execute:

def fix_directory_lookup_indexes():
    update_query = get_update_system_site_directory_lookup_index_query('{AAAA-AAAA-AAAA-AAAA}', 4)
    # 转换为字符串后执行
    query_result = connection.cursor.execute(str(update_query))

2. (可选)使用参数化查询提升安全性

如果要避免SQL注入风险,推荐使用PyPika的参数绑定功能,再将参数传给execute的第二个参数:

def get_update_system_site_directory_lookup_index_query():
    schema = Schema('companyconfig')
    table = Table('routing', schema)
    # 使用参数占位符
    return MySQLQuery.update(table) \
        .set(table.SequenceNumber, Parameter('seq_num')) \
        .where((table.SiteGuid == Parameter('site_guid')) & (table.Type == 'directories'))

def fix_directory_lookup_indexes():
    update_query = get_update_system_site_directory_lookup_index_query()
    # 传入参数字典
    query_result = connection.cursor.execute(
        str(update_query),
        {'seq_num': 4, 'site_guid': '{AAAA-AAAA-AAAA-AAAA}'}
    )

验证说明

转换为字符串后的SQL语句和你直接在数据库执行的语句完全一致,可保证逻辑正确性;参数化查询则进一步提升了代码的安全性和可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:07:29