Не вставка строк в mysql с приложением flask, но идентификатор автоинкремента - PullRequest
0 голосов
/ 16 марта 2020

Я учусь создавать приложение flask, которое вставляет записи в базу данных mysql, значения которой получены из формы html.

Я написал следующий фрагмент кода:

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_mysqldb import MySQL

app = Flask(__name__)

#MySql Connection
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'flaskcontacts'
mysql = MySQL(app)

# settings
app.secret_key = 'mysecretkey'

@app.route('/')
def Index():
    return render_template('index.html')

@app.route('/add_contact', methods=['POST'])
def add_contact():
    if request.method == 'POST':
        fullname = str(request.form['fullname'])
        phone = str(request.form['phone'])
        email = str(request.form['email'])
        cur = mysql.connect.cursor()
        print(str(fullname), phone, email)
        cur.execute("INSERT INTO flaskcontacts.contacts (fullname, phone, email) VALUES (%s, %s, %s)",
        (fullname, phone, email))

        mysql.connection.commit()
        flash('Contact Added successfully')

        return redirect(url_for('Index'))

После того, как я его выполнил, я вижу, что получаю сообщение «Контакт успешно добавлен», но я не вижу никаких записей в базе данных mysql, однако я вижу, что Id, автоинкрементный, увеличивается , Поэтому, если я обновлю таблицу непосредственно в базе данных, она будет работать и покажет мне номер идентификатора, который уже автоинкремментирован, как если бы предыдущий фрагмент кода работал, но не обновлял его вообще.

У меня есть потратил много часов, пытаясь решить эту проблему, но помимо ответа я был бы признателен, если бы вы могли помочь мне с некоторыми лучшими практиками, как отладить проблемы такого типа.

С уважением

Ответы [ 2 ]

1 голос
/ 16 марта 2020

MySQL сгенерирует идентификатор автоинкремента, прежде чем попытаться вставить. Но INSERT может завершиться неудачей, например, если INSERT вызывает конфликт ограничений, строка не будет создана.

Идентификатор автоинкремента не может быть «нераспределенным» или иным образом возвращен в коллекцию значений ID для раздачи. Некоторый другой параллельный сеанс мог уже распределить следующее значение, и MySQL не поддерживает пул значений ID, он знает только о последнем значении, выделенном для таблицы.

Поэтому MySQL придется подождать, пока INSERT завершится успешно (включая проверку всех ограничений, выполнение любых триггеров и т. Д. c.), В то же время блокируя любые другие параллельные сеансы от выполнения их INSERT. Только тогда он может надежно распределить идентификаторы без «потери» каких-либо значений.

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

Ваше приложение печатает «Контакт успешно добавлен», даже если INSERT привел к ошибке. Вы не проверяете наличие ошибок в приведенном выше коде, так как вы узнали, что оно прошло успешно?

В любом случае, вам не стоит беспокоиться о «потраченных» значениях ID. Они не предназначены быть последовательными, только уникальными. Если вы чувствуете, что у вас закончились целые числа, тогда сделайте математику. Каково максимальное значение вашего целочисленного столбца? Какова скорость генерации новых значений? Основываясь на этом, вы должны быть в состоянии выяснить, сколько у вас есть времени, прежде чем закончится. Это не должно быть трудно для разработчика программного обеспечения, чтобы сделать эту простую математику.

0 голосов
/ 17 марта 2020

Проблема была здесь в этой строке:

cur = mysql.connect.cursor()

Это внутри функции add_contact.

Правильная функция для использования:

cur = mysql.connection.cursor()

Итак это было соединение вместо соединение .

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