Python - 从请求获取十进制值并在MySQL中插入

问题描述 投票:0回答:1

我有一个带有博物馆表的MySQL数据库:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| idMuseums   | int(11)      | NO   | PRI | NULL    | auto_increment |
| nameMuseums | varchar(45)  | YES  |     | NULL    |                |
| City        | varchar(60)  | NO   |     | NULL    |                |
| Lat         | decimal(9,6) | NO   |     | NULL    |                |
| Lon         | decimal(9,6) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

使用Android客户端,我通过StringRequest使用以下参数将gps坐标发送到Python服务器:

//some code
params.put("lat", String.format("%.6f",lat));       
params.put("lon", String.format("%.6f",lon));
Log.d(IDENTIFIER,"lat lon in request: "+String.format("%.6f",lat)+" "+String.format("%.6f",lon));

^----in log the coordinates are correct and they have a comma, e.g. 45,451691 9,161442

所以,在服务器(使用Flask)中,我想添加新的博物馆,我试过这个:

try:
    m = Museum(id=0, name=request.form['name'], city=request.form['city'], lat=request.form['lat'], lon=request.form['lon'])
    db.session.add(m)
    db.session.commit()
    return '', 200
except Exception as e:
    db.session.rollback()
    return e

问题是:

  1. 如果我在示例中使用lat=request.form['lat'], lon=request.form['lon'],我不会得到数据库中逗号之后的数字(例如45.000000 9.000000)
  2. 如果我使用lat=float(request.form['lat']), lon=float(request.form['lon'])我得到TypeError: 'exceptions.ValueError' object is not callable
  3. 如果我使用lat=Decimal(request.form['lat']), lon=Decimal(request.form['lon'])我得到TypeError: 'InvalidOperation' object is not callable

我错过了什么?

python mysql flask floating-point
1个回答
1
投票

MySQL使用点字符(句点)作为数字文字中的小数分隔符,而不是逗号字符。

要插入十进制值,SQL语句将是这样的

  ( ..., lat, lon, ...)  VALUES  ( ... , '45.451691' , '9.161442' , ...)
  --                                        ^            ^

使用字符串中的逗号字符,MySQL正在删除逗号和逗号之后的所有内容。

作为正在发生的事情的演示,请考虑:

 SELECT '123.456789' + 0 
      , '123,456789' + 0
      , '123derpity' + 0 

参考文献:

https://dev.mysql.com/doc/refman/5.7/en/number-literals.html

数字可能包括。作为小数点分隔符。

© www.soinside.com 2019 - 2024. All rights reserved.