Python-SQLAlchemy正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果!

问题:在使用mysql数据库的时候【Float类型生成的长度和精度均为0】,不管是直接操作mysql还是使用SQLAlchemy的filter条件查询浮点数都是如此!

# 查询price字段【定义为Float类型】导致查询==条件的时候失败
orders = db.session.query(cls.create_time, cls.price, cls.amount).filter(
            price_pairs[compare_price][0] <= price_pairs[compare_price][1]).all()

转换成SQL语句如下:

SELECT buy_order_model.create_time AS buy_order_model_create_time, buy_order_model.price AS buy_order_model_price, buy_order_model.amount AS buy_order_model_amount 
FROM buy_order_model 
WHERE buy_order_model.price = 0.01

错误分析方法:在使用SQLAlchemy中,如果遇到查询失败的情况最好的调试办法就是生成SQL表达式,直接在数据库运行,你就会发现错误的原因到底是数据库导致的,还是你的Python代码问题!

参考SQLAlchemy如何生成SQL表达式:https://blog.csdn.net/weixin_43343144/article/details/91126987

解决方案有两个:

网上的解决方法之一:正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果:https://blog.csdn.net/weixin_34179762/article/details/86265222

上面这篇文章分析的非常好,其实我遇到的就是这个问题!但是依然存在一个问题,就是查询结果浮点数返回来的是一个Decimal类型对象,必须转换成float才能传入前端显示!【jsonfy是不支持Decimal对象的解析】

网上解决方案之二:这个是mysql查询浮点型数据结果有错误:https://blog.csdn.net/hoooooly/article/details/80418300

最终我选择的解决方案如下【既然查询结果都是要转换成Decimal类型,那么直接用Decimal定义浮点数即可】

#如果字段定义为Decimal小数类型的话,返回的结果也是Decimal类型,要转换float才能发送给前端
price = db.Column(db.DECIMAL(20,6), nullable=False)

切记:不管是MySQL还是SQLAlchemy中不要使用Float或db.Float来生成浮点类型,会导致长度和精度均为0,使用Decimal直接定义保证没问题!

MySQL中Decimal类型和Float Double等区别:https://www.cnblogs.com/xujishou/p/6307299.html

猜你喜欢

转载自blog.csdn.net/weixin_43343144/article/details/91127068