Python - получить десятичное значение из запроса и вставить в MySQL - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть база данных 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 я отправляю координаты GPS на сервер Python через StringRequest со следующими параметрами:

//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.

Чего мне не хватает?

1 Ответ

0 голосов
/ 18 сентября 2018

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

Номера могут включать в себя.в качестве десятичного разделителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...