[英]MySQL and Python - how to check an entry with user input?
我們正在創建一個基本的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語句轉到第二個if語句,並保存了“新”名稱(盡管由於該條目已經存在,所以未對數據庫進行任何更改)
根據DB API , cur.execute
的返回值是不確定的。 所以如果你用
logincheck = cur.execute(loadname, login)
那么您的代碼將依賴於數據庫適配器的特定行為。 例如, MySQLdb
返回所選行的主鍵(如果存在),如果沒有這樣的行,則返回0L
。 盡管如此,我認為最好不要依靠這一點。
如果您只堅持使用DB API保證的行為,那么您的代碼將更加通用。
相反,您可以使用
cur.execute(loadname, login)
logincheck = cur.fetchone()
這將使logincheck
一個元組(如果存在行)或值為None
。 如果login
是CharactersDB
的ID
,則logincheck
看起來像元組(login, )
,而不是字符串login
。 如果login
不是ID,則logincheck
將為None。
因此, 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.