我正在使用Flask、Flask RESTful、Flask SQLAlchemy和MySQL编写API。问题是filter()
和filter_by
根本不起作用
型号:
from app import db
from datetime import datetime
class AreaModel(db.Model):
__tablename__ = 'aqi_records'
id = db.Column(
db.Integer,
primary_key=True
)
aqi = db.Column(
db.Integer,
index=False,
unique=False,
nullable=False
)
latitude = db.Column(
db.Float,
index=False,
unique=False,
nullable=False
)
longitude = db.Column(
db.Float,
index=False,
unique=False,
nullable=False
)
created = db.Column(
db.DateTime,
index=False,
unique=False,
nullable=False,
default=datetime.now()
)
def __repr__(self):
return '<Area {}>'.format(self._string_coords())
def _string_coords(self):
return str(self.latitude) + '-' + str(self.longitude)
def as_dict(self):
r = {c.name: getattr(self, c.name) for c in self.__table__.columns}
r['created'] = str(r['created'])
return r
资源:
from flask_restful import Resource, request
from models import AreaModel
class AreaResource(Resource):
def get(self):
area_coords = request.args.get('area_coords')
if not '-' in area_coords:
return {'code': 400, 'message': 'Invalid coordinate format'}, 400
latitude, longitude = area_coords.split('-')
latitude, longitude = float(latitude), float(longitude)
area = AreaModel.query.filter_by(latitude=latitude).first() # this is the line with the problem
if not area:
return {'code': 404, 'message': 'Area not found'}, 404
return area.as_dict()
当我使用AreaModel.query.all()
时,我得到表中的所有记录。但是如果我添加过滤器,我总是得到None
结果,我不明白为什么
编辑1: 接收到的数据(coords)正确; 类型:浮子
编辑2:
.get()
也不起作用
浮点数很难使用,因为浮点数的文字表示可能与计算中使用的值或存储在数据库中的值不完全对应。在对this question的回答中对这种行为进行了深入讨论。MySQL中使用浮点进行查询的具体实例可以在here和here中找到
为了解决这个问题,MySQLdocs建议使用
DECIMAL
类型代替FLOAT
或DOUBLE
在这个特定的例子中,我认为您可以选择使用
DECIMAL
(和Python Decimal类型)或字符串来表示纬度和经度DECIMAL
可能是更好的选择下面是一个简短的示例,演示了如何使用浮点查询并不总是产生预期的结果:
输出(删除SQL日志):
相关问题 更多 >
编程相关推荐