寫了一個往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)