python sqllite的probably unsupported type问题解决

写了一个往sqllite的某张表插入数据的程序,大致代码如下:

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)

执行时报错:

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,))

打印出的信息如下:

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",于是想到会不会是参数类型的问题,于是在代码中加入打印类型的代码,如下:

	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,))

再执行,打印如下信息:

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就好了,如下:

gameIdiom = GameIdiom(id=str(uuid4()),play_time=time(),game_id=self.id)

 

转载于:https://my.oschina.net/u/914897/blog/1614171

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值