来自mysql的数据类型

时间:2011-12-09 10:16:32

标签: python 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

我只是想计算数据库中一列中的不同项,并在文件中打印INT值。

任何人都可以解释为什么SELECT命令会返回一个奇怪的数据格式,如((2052L,163581L),)?不明白为什么数字后面有“L”..

我该如何解决这个问题?非常感谢!

2 个答案:

答案 0 :(得分:2)

uniq是一个元组元组(外层的每个条目代表一个数据库,其中有一个列值的元组)。

您的查询始终返回一行。因此外部元组总是包含一个元素,您可以通过替换:

来修复代码
uniq = cur.fetchall()

uniq = cur.fetchall()[0]

此外,从int到string然后再返回int的转换是不必要的。

总结一下,以下是您的代码的整理版本:

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

答案 1 :(得分:2)

您的代码存在一些问题。

首先,cur.fetchall() - 顾名思义 - 从查询中获取所有结果。由于Python不知道您的查询只返回一行,它仍然返回所有行的元组。所以uniq[0]不引用行中的第一个字段,它引用结果中的第一行。

由于您知道只需要一行,因此可以使用cur.fetchone()

其次,为什么要将结果转换为字符串然后将它们转换回int?这似乎毫无意义。它们的格式已经正确 - L只是意味着它们是'长期'。