将 MySQL Decimal 类型的 pymysql 查询结果转换为 Python float



我对Python(3.x(相对较新,该语言的混淆行为之一是十进制和浮点似乎是不同的类型(我认为这里的区别是双精度/浮点数之间的常见区别......

使情况复杂化的是,我的 Python 逻辑读取/写入 MySQL 记录,字段定义为十进制(具有多种格式(。

在写入端,我像这样pymysql编码器:

import numpy as np
import pymysql
pymysql.converters.encoders[np.float64] = pymysql.converters.escape_float
pymysql.converters.conversions = pymysql.converters.encoders.copy()
pymysql.converters.conversions.update(pymysql.converters.decoders)

我相信,这有助于将Python小数持久化到MySQL记录中。

但是在读取方面,当我们通过pymysql查询读取Decimal字段时,似乎没有明显的方法来获取Pythonfloat。 (也许这将代表一种沮丧,因此可能会丢失数据。

人们在这里做什么? 约定是否只是在任何地方使用十进制类型来规避这些向下/向上转换问题? 那么通过pymysql的MySQL接口呢?

我的总体想法是,浮动/双重行为应该是自动的。 该语言强加了浮点/双精度之间的区别可能是一件好事;但是,由于简单的+-操作数不能优雅地处理各种类型,该代码完全中断确实令人困惑。

谢谢。

可能对OP没有帮助,但这可能有助于其他发现自己处于类似情况的人。您可以默认解码器,默认情况下为十进制

import pymysql
query = """
select * from db.table
"""
connection_string = {"host":"localhost","port":"3306","user":"user","password":"***","database":"db"}
conversions = pymysql.converters.conversions
conversions[pymysql.FIELD_TYPE.DECIMAL] = lambda x: float(x)
conversions[pymysql.FIELD_TYPE.NEWDECIMAL] = lambda x: float(x)
conn = pymysql.connect(
host=connection_string.get("host"),
user=connection_string.get("user"),
password=connection_string.get("password"),
db=connection_string.get("database"),
charset="utf8",
conv=conversions,
cursorclass=pymysql.cursors.DictCursor,
autocommit=True
)
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()

最新更新