1

私たちはテキストベースのゲーム (MUD) に取り組んでおり、この障害にぶつかっています。

コード:

class RoomMove():

    def __init__(self):
        self.room = 1
        self.name = 'Lorinth'
        self.moveRooms()
        self.updateRoom()

【余分なコードは関係ありません】

def updateRoom(self):
        global c
        room = str(self.room)
        room = (room)
        print room
        while room > 0:
            c.execute("""SELECT * FROM RoomPlayers where ID=?""", room)
            spaceCheck = c.fetchone()
            print spaceCheck
            counter = 1
            if spaceCheck[counter] not in ('', None):
                counter += 1
            else:
                room = self.room
                name = self.name
                c.execute("""UPDATE RoomPlayers SET '1'=? WHERE ID=?""", (name, room))
        conn.commit()

次のエラーがスローされます。

     c.execute("""SELECT * FROM RoomPlayers where ID=?""", room)
ValueError: parameters are of unsupported type

編集: (room, ) で試してみましたが、エラーに違いはありません。

何か案は?

ありがとう!

4

2 に答える 2

1

ドキュメントで読むことができるように:

フェッチワン()

クエリ結果セットの次の行をフェッチして単一のシーケンスを返すか、使用できるデータがなくなった場合は None を返します。

これ以上データがない場合、c.fetchone() は spaceCheck 変数に None を代入するため、spaceCheck[counter] にアクセスしようとすると TypeError になります。

そのようなことを試してください:

        if spaceCheck is not None:
            counter += 1

アップデート

交換する必要があります

room = (room)

と:

room = (room, )

別のアップデート

以下のようなテーブルを作成するとします。

sqlite> CREATE TABLE RoomPlayers (ID numeric, player_name VARCHAR);

コードは次のようになります。

class RoomMove():

    def __init__(self, room, name):
        self.room = room
        self.name = name
        self.con = None
        self.db_path = "./foo.sqlite"

    def updateRoom(self):
        try:
            # Globals are evil. Don't use them 
            self.con = sqlite3.connect(self.db_path)
            c = con.cursor()
            # comparing tuple or string to number dosen't make sense. Compare original number
            # You should check if room is valid inside constructor
            #  while room > 0 would probably lead to indefinite loop
            if rooom > 0:
                #You don't have to cast room number to string
                c.execute("""SELECT id FROM RoomPlayers where ID=?""", (self.room, ))
                spaceCheck = c.fetchone()

                # Your counter takes only two values so you can do it like that
                counter = 2 if spaceCheck is not None else 1

                if counter == 1:
                    # Don't name columns '1' - it is really bad idea
                    # Like above - coneverting room and name to string is pointlees
                    c.execute("""UPDATE RoomPlayers SET 'player_name'=? WHERE ID=?""", (self.name, self.room))
                    self.con.commit()

        finally:
            # No matter what happens close connection
            if self.con is not None:
                self.con.close()
于 2013-09-07T21:39:19.597 に答える
0

上記の問題を修正したもの:

sqlite3 は整数を読み取らず、文字列のみを読み取ります。(実際にはそうではありません)

そこで、else ループで整数を文字列として読み取るようにしました。

ここ:

else:
        room = self.room
        name = self.name
        c.execute("""UPDATE RoomPlayers SET '1'=? WHERE ID=?""", (name, room))

room が c.execute に整数として渡されていますが、解決策は?

else:
    room = str(self.room)
....

それを見るのに永遠にかかりました!

于 2013-09-07T22:48:59.190 に答える