簡體   English   中英

MySQL和Python-如何使用用戶輸入檢查條目?

[英]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 APIcur.execute的返回值是不確定的。 所以如果你用

logincheck = cur.execute(loadname, login)

那么您的代碼將依賴於數據庫適配器的特定行為。 例如, MySQLdb返回所選行的主鍵(如果存在),如果沒有這樣的行,則返回0L 盡管如此,我認為最好不要依靠這一點。

如果您只堅持使用DB API保證的行為,那么您的代碼將更加通用。

相反,您可以使用

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

這將使logincheck一個元組(如果存在行)或值為None 如果loginCharactersDBID ,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM