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)
相关文章
相关标签/搜索