我的模型大致如下:
class Property(Base):
__tablename__ = 'Property'
id = Column('Id', Integer, primary_key=True, autoincrement='auto')
name = Column('Name', String(255))
growth = Column('Growth', Float(2))
在MySQL中,Growth列的类型为float(6,2)。
当我在Name上查询时,它会匹配得很好。
prop_obj = session.query(Property).filter(Property.name == fund_dict['name'])
如果我将float属性Growth添加到filter()子句中,它将无法匹配数据库中的任何内容。
prop_obj = session.query(Property).filter(Property.name == func_dict['name'], Property.growth == func_dict['growth'])
根据SQLAlchemy Docs,当我打印出SQL语句时,我看到了:
>>> statement = prop_obj.statement
>>> print(statement.compile(dialect=mysql.dialect()))
SELECT `Property`.`Id`, `Investment`.`Name`, `Property`.`Growth`
FROM `Property`
WHERE `Property`.`Name` = %s AND `Property`.`Growth` = %s
%s是否表示发生的替换是字符串而不是浮点数?这可以解释为什么它不匹配。如果是这样,我如何使替换成为浮点而不是字符串?
我使用的是Python 3.5和SQLAlchemy 1.0.11。感谢。
答案 0 :(得分:2)
不,%s
只是参数的占位符。 It is always %s
. 不% - 将参数格式化为字符串。您可以在查询中看到相关证据,其中未引用与name
进行比较的文字。
相反,您可能正在尝试将稍微不同的浮点值与数据库中的值进行比较。由于未精确存储浮点数,因此精确比较是有问题的。您应该做的是查看您的值与数据库中的值之间的差异是否小于某个阈值:
func.abs(Property.growth - func_dict['growth']) < 0.01