python sqllite的probably unsupported type問題解決

寫了一個往sqllite的某張表插入數據的程序,大體代碼以下:python

class GameIdiom(object):
	def __init__(self, id, idiom_id=None, all_word=None, play_time=None, game_id=None):
		self.id = id
		self.idiom_id = idiom_id
		self.all_word = all_word
		self.play_time = play_time
		self.game_id = game_id
	def isNext(self, first_word):
		return self.all_word[len(self.all_word)-1] == first_word
	def copyFromIdiom(self, idiom):
		self.idiom_id = idiom.id
		self.all_word = idiom.all_word
....
class IdiomDao(object):
	def insertGameIdiom(self, gameIdiom):
		self.con.execute("insert into game_idiom(id, idiom_id, all_word, play_time, game_id) values(?,?,?,?,?)",(gameIdiom.id,gameIdiom.idiom_id,gameIdiom.all_word,gameIdiom.play_time,gameIdiom.game_id,))
...
class Game(object):
    gameIdiom = GameIdiom(id=uuid4(),play_time=time(),game_id=self.id)
    self.idiomDao.insertGame(self)

執行時報錯:sql

sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type數據庫

由於是第一次使用python往sqllite插入數據,起初懷疑是否是使用這種佔位符的方式來插入有問題,上網上找了半天無解,後面想是否是值有什麼問題致使的,因而把要插入的對象中的全部值打印了來,以下:測試

def insertGameIdiom(self, gameIdiom):
		print('\n'.join(['%s:%s' % item for item in gameIdiom.__dict__.items()]))
		self.con.execute("insert into game_idiom(id, idiom_id, all_word, play_time, game_id) values(?,?,?,?,?)",(gameIdiom.id,gameIdiom.idiom_id,gameIdiom.all_word,gameIdiom.play_time,gameIdiom.game_id,))

打印出的信息以下:ui

id:50415712-8e3a-49bc-bb51-97fc58ead818
idiom_id:fc947044-4258-4f1f-86c1-03d1f7a08c43
all_word:無邊無際
play_time:1517109225.0413642
game_id:0c4ea9dc-470d-4ac4-af08-492d51bd68dc

而後把這些值手工設置到GameIdiom類中,在命令行調用insertGameIdiom方法來測試看是否是值有問題,以下:命令行

gameIdiom = GameIdiom('50415712-8e3a-49bc-bb51-97fc58ead818','fc947044-4258-4f1f-86c1-03d1f7a08c43','無邊無際',1517109225.0413642,'0c4ea9dc-470d-4ac4-af08-492d51bd68dc')
idiomDao.insertGameIdiom(gameIdiom)

結果發現沒有問題,這說明不是對象中的值的問題,這是再仔細看異常信息發現關鍵字爲" probably unsupported type",因而想到會不會是參數類型的問題,因而在代碼中加入打印類型的代碼,以下:3d

def insertGameIdiom(self, gameIdiom):
		print('\n'.join(['%s:%s' % item for item in gameIdiom.__dict__.items()]))
		print(type(gameIdiom.id))
		self.con.execute("insert into game_idiom(id, idiom_id, all_word, play_time, game_id) values(?,?,?,?,?)",(gameIdiom.id,gameIdiom.idiom_id,gameIdiom.all_word,gameIdiom.play_time,gameIdiom.game_id,))

再執行,打印以下信息:code

id:5e5326dd-6d46-4526-9d30-ec97177d748d
idiom_id:fc947044-4258-4f1f-86c1-03d1f7a08c43
all_word:無邊無際
play_time:1517133390.0591135
game_id:4daa77d1-fd70-4bcb-865e-8b4adcab7957
<class 'uuid.UUID'>

發現原來id這個字段的類型爲uuid.UUID類型,而數據庫中對應的類型爲varchar型,因此就報錯了,解決方式很簡單了,就是在傳入參數時把uuid轉爲str就行了,以下:sqlite

gameIdiom = GameIdiom(id=str(uuid4()),play_time=time(),game_id=self.id)
相關文章
相關標籤/搜索