Запрос в MySQL в Python


В моем коде у меня есть три запроса к базе данных MySQL:

@app.route('/private', methods=['POST'])
def private():
    login = request.form['login']
    if login is None or not login:
        return jsonify(data='Incorrect URL')

    try:
        c, conn = cursor_connection()
        c = conn.cursor()
        c.execute("SELECT accounts_info_uid "
                  "FROM auth_info WHERE login='{}' ".format(login))

        id = c.fetchall()
        if not id:
            return jsonify(data='Incorrect login')

        c.execute("SELECT * FROM boxes_id AS tb1 LEFT JOIN"
                  " accounts_info AS tb2 ON tb2.boxes_ids=tb1.uid "
                  # "LEFT JOIN electricity_info as tb3 ON tb3.boxes_id_uid=tb1.uid"
                  " WHERE tb2.uid={} ".format(id[0][0]))

        uid, mc_address, working_status, activation_status, _,\
        first_name, second_name, registration_date, phone, email, boxes_id = c.fetchall()[0]
        c.execute(" SELECT consumed_electricity "
                  "FROM electricity_info "
                  "WHERE boxes_id_uid={} ".format(boxes_id))
        consumed_electricity = [float(val[0]) for val in c.fetchall()]
        c.close()
        conn.close()

    except Exception as e:
        logger.error(msg='Cannot execute /private {}'.format(e))
        return str(e)

Я принесла список от электричества информация по первичному ключу в boxes_id (Так в electricity_info это называется boxes_id_uid).

Структура ПК в моих таблицах:

auth_info --------> pk is accounts_info_uid

boxes_id ----------> pk is uid

accounts_info ------> pk is uid and it is connected to table boxes_id by field boxes_id

electricity_info ------> pk is boxes_id_uid

Я думаю, что это может быть оптимизирован в один SQL запрос. Если это так, вы можете сказать мне, как этого добиться?



159
3
задан 2 февраля 2018 в 07:02 Источник Поделиться
Комментарии
1 ответ


  1. Не! Формат строки SQL-запросов, но давайте курсор сделает это за вас.

    Как @Гарет Риз сказал, это не безопасно!


    c.execute("SELECT accounts_info_uid "
    "FROM auth_info WHERE login='{}' ".format(login))

    Как взяты из документации, это будет правильный способ выполнения инструкций в SQL:

    cursor.execute("SELECT accounts_info_uid FROM auth_info WHERE login = %s", login)

  2. Вы можете использовать контекстное менеджер по подключению

    С помощью контекстного менеджера позволит улучшить читабельность, см. PEP343

    Есть какой-то ресурс там, как реализовать такую вещь


  3. Сделать входа отдельная функция

  4. Я думаю, что это может быть оптимизирован в один SQL запрос?

    Да, но без самой базы данных трудно проверить, в GitHub РЕПО или больше информации бы помочь.

    Однако вы могли бы улучшить на ваш Google-фу, просто набрав слова "MySQL объединить 3 таблицы" дал бы вам ответ, который вы ищете.

    https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql


3
ответ дан 2 февраля 2018 в 08:02 Источник Поделиться