2

我们正在创建一个基本的 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 语句到第二个,保存了“新”名称(尽管由于条目已经存在,所以没有对数据库进行任何更改)

4

1 回答 1

1

根据DB API,返回值cur.execute是未定义的。所以如果你使用

logincheck = cur.execute(loadname, login)

那么您的代码将依赖于您的数据库适配器的特定行为。MySQLdb例如,返回所选行的主键(如果存在),或者0L如果没有这样的行。不过,我认为最好不要依赖这个。

如果您只坚持 DB API 保证的那些行为,您的代码会更通用一点。

相反,您可以使用

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

这将logincheck生成一个元组(如果存在一行)或值None。如果loginIDin CharactersDB,则logincheck看起来像元组(login, ),而不是字符串login。如果login不是 ID,则为logincheckNone。

所以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))
于 2013-07-06T19:01:25.233 回答