SQL-запрос не вернет вновь добавленную строку после нажатия кнопки «назад», несмотря на то, что строка добавляется в базу данных - PullRequest
0 голосов
/ 09 июля 2019

У меня есть приложение фляги, которое имеет регистрационную форму, которая POST передает данные в представление registration.py, где данные добавляются в базу данных SQLite. Каждый раз, когда происходит регистрация, в базу данных вставляется новая строка.

Что ожидается:

После отправки формы, если пользователь нажимает кнопку "Назад" в браузере и пытается отправить форму еще раз, приведенный ниже код должен

  1. try, чтобы проверить, существует ли электронная почта
  2. Если exception (электронная почта не существует), введите данные

Выпуск:

Когда пользователь нажимает кнопку «Назад» и снова отправляет форму, код в блоке try не распознает ранее (до нажатия кнопки «Назад») добавленную строку. Сбой запроса select.

И еще более странная вещь:

Однако, когда я просто распечатываю все строки в базе данных непосредственно перед блоком try, это показывает только что добавленный email. Однако запрос select не видит его.

Registration.py блок выдачи :

    db = get_db()

    # Dumping to log to check if the db actually has the row
    cur_e = db.execute('SELECT user_id, user_email FROM cld_user')
    ie = cur_e.fetchall()
    for i in ie:
        print "ID: {} | Email: {}".format(i[0], i[1])
    print "end of ID dump" 
    print user_email
    # The above code does print out the row (even after hitting the back button)

    try:
        # This block however, fails when user submits the form after hitting the back button
        print "Trying"
        cur_ps = db.execute('SELECT user_id, user_uid FROM cld_user \
            WHERE user_email = ?', [user_email])
        user_id = cur_ps.fetchone()[0]
        user_uid = cur_ps.fetchone()[1]
        print "Row exists"
        flash(user_id, "success")

    except Exception:
        print "Exception"
        cur_p = db.execute('INSERT OR IGNORE INTO cld_user \
            (user_uid, user_name, user_email, user_contact) \
            VALUES (?, ?, ?, ?)', [user_uid, user_name, 
            user_email, user_contact])
        user_id = cur_p.lastrowid
        print "No row exists"
        flash(user_id, "success")

1 Ответ

0 голосов
/ 10 июля 2019

Блок try всегда терпит неудачу. Сбой в этой строке user_uid = cur_ps.fetchone()[0], если запрос не возвращает строк. Сбой в этой строке user_uid = cur_ps.fetchone()[1], если запрос возвращает одну строку.

fetchone возвращает по одной строке за раз. Эта строка user_id = cur_ps.fetchone()[0] ищет элемент 0 в списке, возвращаемом fetchone. Если нет строк с совпадающим user_email, он завершается с ошибкой «Объект типа None не подписан» и, следовательно, выполняет блок except

Если возвращается строка , управление переходит на эту строку user_uid = cur_ps.fetchone()[1]. Если запрос вернул 2 или более строк, эта строка будет успешной. Если он вернул только 1 строку, строка потерпит неудачу, потому что результатом fetchone является None, и он выдаст «Объект типа None не может быть подписан».

При возможной коррекции: установите переменную с результатом fetchone, например, row = cur_ps.fetchone(), а затем установите другие переменные на row[0] и row[1] соответственно.

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