Python从MySQL获取DOUBLE值时触发int base10字面量双重获取错误求助
解决MySQL DOUBLE类型取值时的"invalid literal for int() with base 10"错误
首先,你遇到的这个错误本质是Python尝试将非整数值(或对应字符串)强制转换为整数时抛出的典型问题,结合你的场景,主要有几个触发点,我们一步步来解决:
1. 先修复SQL查询的语法与逻辑问题
你的原查询存在两个关键问题:
- 用逗号分隔表的隐式连接写法不够规范,容易出现逻辑漏洞,建议改用显式
JOIN语法 Y.hour=...未补全关联条件,这会直接导致SQL语法错误,返回异常结果,进而引发后续类型转换问题
另外,绝对不要用字符串拼接构建SQL查询——这不仅有严重的SQL注入风险,还会因为类型转换(比如str(Y_interfaz_id)把数值转成字符串)导致数据库层面的类型不匹配,比如如果interfaz_id是INT类型,拼接后可能变成interfaz_id='123.45'(若Y_interfaz_id为float),触发条件匹配异常。
改用参数化查询的正确SQL写法
我们用参数化查询(占位符%s)重写SQL,同时补全关联条件:
import mysql.connector # 建立数据库连接(根据你的实际配置修改) db_conn = mysql.connector.connect( host="your_host", user="your_username", password="your_password", database="your_database" ) cursor = db_conn.cursor(dictionary=True) # 用字典游标,方便通过列名直接取值 # 规范的SQL语句,使用显式JOIN和参数占位符 query = """ SELECT Y.Y1 AS Y1, X.X1 AS X1, X.X2 AS X2, X.X3 AS X3, X.X4 AS X4, X.X5 AS X5, X.X6 AS X6, X.X7 AS X7, X.X8 AS X8 FROM fxvalues AS Y JOIN ( SELECT * FROM fxvalues WHERE interfaz_id = %s ) AS X ON Y.interfaz_id = %s AND Y.day = X.day AND Y.year = X.year AND Y.month = X.month AND Y.hour = X.hour -- 补全hour的关联条件,确保数据匹配逻辑正确 """ # 传递参数(元组顺序对应SQL里的%s占位符) params = (Y_interfaz_id, id) cursor.execute(query, params) # 获取查询结果 results = cursor.fetchall()
2. 正确处理查询结果的类型
MySQL的DOUBLE类型在Python的mysql-connector驱动中会被映射为float类型,如果你在后续代码中尝试用int()强制转换这些值(比如int(row['Y1'])),而值本身不是整数(比如123.45),就会触发invalid literal for int() with base 10错误。
正确的结果处理方式
for row in results: # 直接获取float类型的值,无需强制转换 y1 = row['Y1'] x1 = row['X1'] # 若确实需要整数形式,可先判断是否为整数值再转换 y1_int = int(y1) if y1.is_integer() else round(y1) print(f"Y1 (原始float): {y1}, Y1 (处理后): {y1_int}") # 记得关闭游标和连接 cursor.close() db_conn.close()
3. 额外排查点
- 确认
interfaz_id字段的类型:如果它是INT类型,确保Y_interfaz_id和id是整数类型,不要传入float值 - 检查查询返回结果:可以先打印
results查看实际返回的数据,确认是否是预期的DOUBLE值,有没有出现字符串或其他异常类型
内容的提问来源于stack exchange,提问作者Angel Lordan
相关产品推荐
相关产品推荐

