我对Python (3.x)比较陌生,该语言的一个令人困惑的行为是,Decimal和float似乎是不同的类型(我在这里假设,这种区别是双重/浮点之间的通常区别……)。
更复杂的是,我的Python逻辑用定义为Decimal (多种格式)的字段对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)我相信,这有助于MySQL记录中的Python小数的持续存在。
但是在读取方面,当我们通过pymysql查询读取Decimal字段时,似乎没有明显的方法获得Python。(这可能意味着数据的下降,因此可能导致数据的丢失。)
这里的人是做什么的?该约定是否只是为了在任何地方使用十进制类型来规避这些向下/向上转换的问题?那么通过pymysql的MySQL接口呢?
我的一般想法是,浮动/双倍行为应该是自动的。语言对float/double进行区分可能是件好事;但是,代码完全崩溃了,因为简单的+或-操作数不能很好地处理各种类型,这确实让人困惑。
谢谢。
发布于 2022-10-19 02:07:08
可能对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()https://stackoverflow.com/questions/59871904
复制相似问题