mysql中数据类型

1 投票
2 回答
2071 浏览
提问于 2025-04-17 08:02

这是我用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))

撰写回答