使用Python将数组与MySQL数据库返回的值进行比较

1 投票
1 回答
950 浏览
提问于 2025-04-17 18:05

我用这个脚本来计算数组 A 中每个元素在数组 B 中出现的次数,结果是正确的。

A = ['text1','text2','text3','text4']
B = ['text1','text2','text3','text4','text1','text2','text3','text4','text1','text2','text3','text4','text1','text2','text3','text4','text1','text2','text3','text4','text3','text4']
for c in A :
    countVar = 0
    for e in B :
        if c == e :
            countVar +=1

    print c     
    print countVar

但是当数组 B 是从 SQL 查询返回的结果时,它只对第一个元素(在这个例子中是 text1)给出了正确的数量,而其他元素的计数却都是 0。

cursor = db.cursor() 
cursor.execute("select * from Table")

A = ['text1','text2','text3','text4']

for element in A:
    #print element 

    for row in cursor.fetchall() :

        if row[0] == element :
            #Count
            countClient += 1
    print row
    print countClient
    countClient = 0

结果是这样的:我知道我的表中有 text2 和 text3
text1
15
text2
0
text3
0
text4
0
有没有人知道这是为什么?或者有什么其他的方法可以做到这一点?我还在做其他计算,比如计算 SQL 数组返回值的总和和平均值,因为我在处理一些数据。

提前谢谢大家!

1 个回答

1

我理解的文档是,fetchall()在第一次循环后不会再返回任何东西。为了调试,你应该检查一下在第二次(以及后面的)循环中,是否真的进入了那个内部的for循环。

要解决这个问题,只需对你的代码做一些小修改,我想到几种方法:

  • fetchall循环一次,把结果存到一个新数组里,然后在你当前的代码中使用这个新数组。
  • 每次都调用execute
  • 重置游标指针。不太确定在Python中是否可以这样做,但我快速搜索了一下没有找到相关信息。

抱歉我不能提供更多具体的细节,因为Python不是我很熟悉的语言。

--

对于第一个选项,可以参考这样的(伪代码):

i = 0
C = []    
for row in cursor.fetchall() :
    c[i] = row[0]
    i += 1

然后在你的内部循环中,使用for el in C,而不是for row in cursor.fetchall()

撰写回答