Обновите последнюю запись в MySQL, используя python (flask) - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать функцию, которая обновляет имя, где идентификатор является последним в базе данных. Это должно быть динамическое c, чтобы при создании новой строки она обновляла строку с первым именем, содержащую наивысший идентификатор.

Я пробовал два подхода, один из которых использует SELECT * FROM names ORDER BY id DESC LIMIT 1 в моем коде ниже и другом, который использует SELECT MAX(id) FROM mytable. Оба подхода потерпели неудачу и вернулись со следующим сообщением об ошибке.

MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting

Вот функция в первом сервисе, которая содержит ошибку:

@app.route("/edit_first_name", methods = ['GET','POST'])
def edit_first_name():
    if request.method == 'POST':
        """
        Collect first name from service 4.
        Amend the first name of last entry in database and display entry in table.
        """
        updated_first_name = requests.get("http://service_4:5003/first_name")
        first_name = updated_first_name.text
        cur = mysql.connection.cursor()
        cur.execute('UPDATE names SET first_name = %s WHERE id = (SELECT * FROM names ORDER BY id DESC LIMIT 1)', (first_name))
        cur.execute('SELECT * FROM names')
        rows = cur.fetchall()
        names = []

        for row in rows: 
            names.append(row)

        mysql.connection.commit()
        cur.close() 
        return render_template("layout.html", first_name = first_name, title = "Name Generator", names = names)

Вот код услуги 4, который генерирует имя:

from flask import Flask, request
import random

app = Flask(__name__)

@app.route("/first_name", methods = ['GET'])
def first_name():
    list = ["Valeria","Perla", "Elisabeth", "Joanna", "Jordan"]
    list += ["Violet", "Conor", "Whitney", "Ethen", "Ronan", "Selina", "Simone"]
    return list[random.randrange(12)]

if __name__ == "__main__":
    app.run(port = 5001, host = "0.0.0.0", debug = True)

1 Ответ

0 голосов
/ 13 июля 2020

Вы не можете использовать подзапрос в обновлении, который выбирает из той же обновляемой таблицы. Вам нужно будет получить идентификатор в отдельном запросе, что усугубит проблемы параллелизма, которые у вас уже есть (риск обновления неправильной строки).

В целом вам в основном нужен другой фундаментальный подход, который делает то, что вы делаем точнее.

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