2

基本的な MUD を作成していて、それを MySQL データベースに保存/ロードする必要があります。最初のコマンドとして、「キャラクターはいますか?」というイニシャルが必要です。プロンプト、「いいえ」の部分が整理され、データベースに正常に保存されます。ただし、「はい」の部分に問題があります。具体的には、ユーザー入力に対して特定のエントリがないかDBをチェックして、それが存在することを確認し、結果としてデータをロードします。

これが私の現在のコードです:

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ステートメントから2番目のステートメントに移動し、「新しい」名前を保存します(ただし、エントリが既に存在するため、データベースは変更されません)

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、タプル (行が存在する場合) または値が作成されますNoneloginIDinCharactersDBの場合、文字列ではなくlogincheckタプルのように見えます。が ID でない場合は、 None になります。(login, )loginloginlogincheck

したがって、次の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 に答える