mysql中数据类型
这是我用Python写的代码:
queryuniq = "SELECT COUNT(distinct src_ip), COUNT(distinct video_id)FROM video"
cur.execute(queryuniq)
uniq = []
uniq = cur.fetchall()
print uniq
ip = str(uniq[0])
video = str(uniq[1])
fd2.write("There are %d ip addresses and %d video in total" %(int(ip), int(video)))
这是我得到的“uniq”变量的值:
((2052L, 163581L),)
还有这个错误信息:
fd2.write("There are %d ip addresses in total" %(int(ip)))
ValueError: invalid literal for int() with base 10: '((2052L,),)'
video = str(uniq[1])
IndexError: tuple index out of range
我只是想统计数据库中某一列的不同项,并把这个整数值打印到一个文件里。
有没有人能解释一下为什么SELECT命令返回了像((2052L, 163581L),)这样的奇怪数据格式?我不明白为什么数字后面会有个“L”……
我该怎么解决这个问题呢?非常感谢!
2 个回答
2
你的代码有几个问题。
首先,cur.fetchall()
这个函数的名字就说明了,它会把查询的所有结果都取出来。因为Python并不知道你的查询只会返回一行数据,所以它还是会返回一个包含所有行的元组。所以uniq[0]
并不是指这一行的第一个字段,而是指结果中的第一行。
既然你知道只想要一行数据,可以用cur.fetchone()
来获取。
其次,为什么要把结果转换成字符串,然后再转换回整数呢?这看起来没有必要。结果本来就是正确的格式,L
只是表示它们是“长整型”的整数。
2
uniq
是一个包含多个元组的元组(外层的每个条目代表数据库中的一行,而每行内部又包含一组列值)。
你的查询总是返回一行数据。因此,外层的元组总是只包含一个元素。你可以通过把:
uniq = cur.fetchall()
替换成
uniq = cur.fetchall()[0]
另外,从整数转换成字符串再转换回整数的过程是多余的。
总的来说,下面是你代码的一个简化版本:
queryuniq = "SELECT COUNT(distinct src_ip), COUNT(distinct video_id)FROM video"
cur.execute(queryuniq)
uniq = cur.fetchall()[0]
ip, video = uniq
fd2.write("There are %d ip addresses and %d video in total" %(ip, video))