MySQL и Python - как проверить запись с пользовательским вводом?

Мы создаем базовый MUD и хотим, чтобы он сохранялся / загружался из базы данных MySQL, в качестве начальной команды нам нужно иметь начальное "У вас есть символ?" подсказка, у нас есть часть "нет", и она успешно сохраняется в базе данных. Тем не менее, у меня возникли проблемы с частью "да", точнее, с тем, чтобы она проверяла БД на предмет конкретной записи по сравнению с пользовательским вводом, чтобы убедиться, что она существует, и, следовательно, загружала данные.

Вот мой текущий код:

global name
name = ''
savename = ("INSERT INTO CharactersDB (ID) VALUES (%s)")
loadname = ("SELECT ID FROM CharactersDB WHERE ID=%s")

def newname():
    global name
    newchar = raw_input("Do you have a character? (y/n) ")
    if newchar == 'y':
        login = raw_input("Please enter your Character's name: ")
        logincheck = cur.execute(loadname, login)
        if login == logincheck:
            print "pass"
            print "Successfully loaded ", login, "from the database"

        else:
            print "Sorry, could not find you in the database"
            print "Or it just isn't working"

    else:
        name = raw_input("Please enter a new name: ")
        #save new name to the database
        cur.execute(savename, name)
        print "Name saved, you are now called ", name
        db.commit()
        return name

newname()

У меня нет никаких ошибок, он просто переходит от первого оператора if ко второму, сохраняя "новое" имя (хотя в БД не вносятся изменения, так как запись уже существует)

1 ответ

Решение

В соответствии с API БД возвращаемое значение cur.execute не определено Так что если вы используете

logincheck = cur.execute(loadname, login)

тогда ваш код будет зависеть от конкретного поведения вашего адаптера базы данных. MySQLdb например, возвращает первичный ключ выбранной строки (если она существует), или 0L если такой строки нет Тем не менее, я думаю, что лучше не полагаться на это.

Ваш код будет немного более общим, если вместо этого вы будете придерживаться только тех действий, которые гарантированы API БД.

Вместо этого вы могли бы использовать

cur.execute(loadname, login)
logincheck = cur.fetchone()

Это сделает logincheck кортеж (если строка существует) или значение None, Если login является ID в CharactersDB, затем logincheck будет выглядеть как кортеж (login, )не строка login, Если login это не идентификатор, то logincheck Никто не будет

Итак if-statement может выглядеть так:

if logincheck is None:
    print("Sorry, could not find you in the database\nOr it just isn't working")
else:
    print("pass\nSuccessfully loaded {} from the database".format(login))
Другие вопросы по тегам