2013-07-06 41 views
2

我们正在创建一个基本的MUD,并希望它从MySQL数据库中保存/加载,作为初始命令,我们想要一个初始的“你有角色吗?”提示时,我们将“否”部分整理出来,并成功保存到数据库。但是,我在“是”部分遇到问题,更具体地说,它会检查数据库中是否存在针对用户输入的特定条目以确保其存在,并因此加载数据。MySQL和Python - 如何使用用户输入检查条目?

这里是我当前的代码:

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语句的第二个,省“新”名称(虽然没有任何修改,提出db已有条目)

回答

1

符合DB API返回值cur.execute未定义。所以,如果你使用

logincheck = cur.execute(loadname, login) 

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

如果您仅仅坚持DB API所保证的行为,那么您的代码将会更通用一些。

相反,你可以使用

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

这将使logincheck一个元组(如果行存在)或价值None。 如果loginCharactersDB中的ID,则logincheck将看起来像组元(login,),而不是字符串login。 如果login不是ID,那么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)) 
+0

对不起,压痕是我的错与间距不正确时我将代码粘贴。但是,谢谢!我会立即尝试 – mathieu

+0

我想这是一个愚蠢的问题(我们对编程通常还是一个新问题),但是用新的if语句,它是如何检查logincheck的? – mathieu

+0

糟糕,我的错误。它应该是'如果logincheck是None',而不是'如果login是None'。 – unutbu