我们正在创建一个基本的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语句,保存了“new”名称(尽管由于条目已经存在而没有对db进行任何更改)
答案 0 :(得分:1)
根据DB API,cur.execute
的返回值未定义。所以,如果你使用
logincheck = cur.execute(loadname, login)
然后您的代码将依赖于数据库适配器的特定行为。例如,MySQLdb
返回所选行的主键(如果存在),如果没有这样的行,则返回0L
。不过,我认为最好不要依赖它。
如果您只坚持使用DB API保证的那些行为,那么您的代码会更加通用。
相反,你可以使用
cur.execute(loadname, login)
logincheck = cur.fetchone()
这将使logincheck
成为元组(如果存在行)或值None
。
如果login
中ID
为CharactersDB
,那么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))