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))