生产环境使用SSDB数据库,查询起来不是非常方便,因此通过SSDB访问库将常用的查询修改动作集成到了一个python2脚本上。
近期生产环境不再支持python2,因此脚本也需要随之迁移环境。将语法修改完成之后,在连接数据库实例时,一直会异常崩溃,并产生一个位置不明确的错误信息:
a bytes-like object is required, not 'str'
业务代码仅仅进行的实例初始化和auth鉴权:
def connection(host, port):
# ssdb Client connection
ssdb = SSDB(host, port)
ssdb.request(
'auth', ['**************************'])
return ssdb
在逐步调试过程中,发现ssdb可以正常初始化,socket也能正常建立,但是在request处会产生崩溃,最后定位到此:
ret = this.sock.send(s)
根据之前的逻辑,此处的s应该是字符串变量。而python3中,sock需要的是bytes类型。遂在此处进行了一次编码后,再将数据传给sock进行发送:
s = s.encode('utf-8')
问题解决!
此外,接收包的时候也会有同样的问题,即sock接受到的数据为bytes类型,需要进行decode解码成str类型,才能进行字符串操作