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

