Как обновить записи, когда много полей во Flask. питон - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь обновить запись в базе данных sqlite, значения, которые поступают в запросе из внешнего интерфейса:

data: [{"cnt_doc":"17","code":"111","contragent":"Name1","contragent_id":2,"created_date":"Mon, 17 Jun 2019 18:54:37 GMT","date_operation":null,"id":2,"rezerv":"23","status":"Status1","status_id":1,"stellag":"67","storage":"NameStorage","storage_id":2,"sum_operation":"100","timestamp":"Mon, 17 Jun 2019 18:54:37 GMT","type":2,"type_id":2,"id_type":0}]

В моем приложении Flask я делаю это:

from flask import render_template, flash, redirect, url_for, jsonify, request
from app import app, db
from sqlalchemy.exc import SQLAlchemyError
from app.models import Operation

...

@app.route('/operation', methods=['GET', 'POST'])
def operation():   
        method = request.args.get('method')       
        if method == 'Update':
            data = request.form.get("data")
            try:
                objFormat = json.loads(data)
                for key in objFormat:
                    dict_upd = key

                operat = Operation.query.filter_by(id=int(dict_upd['id'])).first()
                for key in dict_upd.keys():
                    setattr(operat, key, dict_upd[key])

                Operation.query.update(operat)#
                db.session.commit()
                jsonFormat = jsonify(dict_upd)
                dictOut = {"data": dict_upd, "meta": {"success": "true"}}

                return (dictOut)
            except SQLAlchemyError as e:
                return jsonify('Error update record in db', exc_info=e)

В моем случае я получаю ошибку при выполнении Operation.query.update (operat) и сильно сомневаюсь, что объект operat имеет необходимую структуру для выполнения обновления. Приведите пример или исправьте мой, чтобы наиболее кратко и правильно обновить записи, когда есть много полей, требующих обновления.

Выполнение записей обновления в этой форме успешно выполнено, но имеет очень громоздкую структуру:

operat = Operation.query.filter_by(id = int(dict_upd['id'])).update(
                                        {'date_operation': dict_upd.date_operation},
                                        {'code': dict_upd.code},
                                        {'status_id': dict_upd.status_id},
                                        {'status': dict_upd.status},
                                        {'type_id': dict_upd.type_id},
                                        {'type': dict_upd.type},
                                        {'storage_id': dict_upd.storage_id},
                                        {'storage': dict_upd.storage},
                                        {'contragent_id': dict_upd.contragent_id},
                                        {'contragent': dict_upd.contragent},
                                        {'sum_operation': dict_upd.sum_operation},
                                        {'rezerv': dict_upd.rezerv},
                                        {'cnt_doc': dict_upd.cnt_doc},
                                        {'stellag': dict_upd.stellag},
                                        )

Поэтому я пытаюсь сократить свой дизайн обновления записей. Спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Если вы расширяете словарь с помощью идентификатора операции, вы можете использовать SQLAlchemy's bulk_update_mappings, чтобы просто обновить их в базе данных с минимальными издержками от ORM.У меня не так много цифр, но по опыту могу сказать, что это будет намного быстрее и менее громоздким.Посмотрите на этот вопрос и документацию

def operation():
  method = request.args.get('method')
  if method == 'Update':
    data = request.form.get("data")
    try:
      objFormat = json.loads(data)
      db.session.bulk_insert_mappings(Operation, objFormat)
      db.session.commit()
      jsonFormat = jsonify(dict_upd)
      dictOut = {"data": dict_upd, "meta": {"success": "true"}}

      return (dictOut)
    except SQLAlchemyError as e:
      return jsonify('Error update record in db', exc_info=e)
1 голос
/ 21 июня 2019

Вы можете просто передать словарь в функцию обновления ( docs ):

operat = Operation.query.filter_by(id = int(dict_upd['id'])).update(dict_upd)

Вы также можете использовать merge для создания или обновления объекта в базе данных:

operat = db.session.merge(Operation( **dict_upd))
...