Таблица SQLite3 не сохраняется правильно - PullRequest
0 голосов
/ 16 января 2019

Недавно я работал над проектом базы данных для входа в систему и столкнулся с проблемой: таблица не сохраняется должным образом.

У меня есть код

def change_password(username, password):
    while 1:
        new_pass = input("Enter new password:\n")
        if not new_pass:
            print("Cancelled")
            raise SystemExit()

        if new_pass == password:
            print("That's already your password.")
        elif len(new_pass) < 6:
            print("Password must be at least 6 characters")
        else:
            break

    cursor.execute("""UPDATE logins SET password = ? WHERE username = ?""", (new_pass, username))

    date_time = dt.now()
    time = date_time.strftime('%H:%M:%S')
    date = date_time.strftime('%d/%m/%Y')

    cursor.execute("""UPDATE logins SET changepass_date = ? WHERE username = ?""", (date, username))
    cursor.execute("""UPDATE logins SET changepass_time = ? WHERE username = ?""", (time, username))
    db.commit()

, который работает точно так, как ожидалось (обновления password, changepass_date и changepass_time).

Однако у меня также есть код

def change_username(username):
    while 1:
        new_username = input("Enter new username:\n")
        if not new_username:
            print("Cancelled")
            raise SystemExit()

        if new_username == username:
            print("That's already your username")
        elif len(new_username) < 6:
            print("Username must be at least 6 characters")
        else:
            break

    try:
        cursor.execute("""UPDATE logins SET username = ? WHERE username = ?""", (new_username, username))
        date_time = dt.now()
        time = date_time.strftime('%H:%M:%S')
        date = date_time.strftime('%d/%m/%Y')

        cursor.execute("""UPDATE logins SET changeuser_date = ? WHERE username = ?""", (date, username))  # doesn't work
        cursor.execute("""UPDATE logins SET changeuser_time = ? WHERE username = ?""", (time, username))  # doesn't work
        db.commit()

        print("Successfully changed your username to '{}'".format(new_username))
    except sql.IntegrityError:
        print("That username is already taken")
        change_username(username)

, который не работает должным образом (он сохраняет только username, а не changeuser_date или changeuser_time). Я потратил много часов на изучение этого и наткнулся на разные страницы StackOverflow, однако это было потому, что не было никакого коммита - что у меня есть (db.commit()).

Код для создания таблицы:

cursor.execute(
    '''
    CREATE TABLE IF NOT EXISTS logins(
        id INTEGER PRIMARY KEY unique,
        username TEXT unique,
        password TEXT,
        admin BOOLEAN,
        created_date TEXT,
        created_time TEXT,
        recent_date TEXT,
        recent_time TEXT,
        changepass_date TEXT,
        changepass_time TEXT,
        changeuser_date TEXT,
        changeuser_time TEXT)
    ''')

Вся помощь очень ценится!

1 Ответ

0 голосов
/ 16 января 2019

К тому времени, когда вы пытаетесь обновить дату и время, имя пользователя уже изменилось, поэтому ваш оператор UPDATE не находит ни одной строки со старым username.

В операторе, который не работает, передайте new_username вместо username в предложение WHERE оператора UPDATE.


Кроме того, вы можете улучшить его и сократить 3 запроса до 1:

cursor.execute(
    """
    UPDATE logins
      SET (username = ?, changeuser_date = ?, changeuser_time = ?)
      WHERE username = ?
    """,
    (new_username, date, time, username))

То же самое касается обновления пароля:

cursor.execute(
    """
    UPDATE logins
      SET (password = ?, changepass_date = ?, changepass_time = ?)
      WHERE username = ?
    """,
    (new_pass, date, time, username))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...