比较SQL值

0 投票
3 回答
741 浏览
提问于 2025-04-16 07:14

我正在用Python和sqlite一起工作,正在实现POP3协议。我有一个表格:

msg_id text
date text
from_sender text
subject text
body text
hashkey text

现在我需要通过检查获取到的邮件的消息ID,来判断是否有重复的邮件。我用md5加密了消息ID,并把它放在了hashkey这一列里。每次我获取邮件时,我都会对消息ID进行哈希处理,然后和表格里的值进行比较。这是我做的:


def check_duplicate(new):
    conn = sql.connect("mail")
    c = conn.cursor()
    m = hashlib.md5()
    m.update(new)
    c.execute("select hashkey from mail")
    for row in c:
        if m.hexdigest() == row:
            return 0
        else:
            continue

    return 1

但是它就是不正常工作。我尝试打印出行的值,结果显示的是unicode格式,这就是问题所在,因为它无法正确比较。

有没有更好的方法来解决这个问题,或者改进我的方法呢?

3 个回答

0

可以考虑让MySQL去查找这个哈希键:

select count(*) from mail where hashkey = 'TheHashKey'
0

主要的问题是,你在尝试把一个Python字符串(m.hexdigest())和一个元组进行比较。

另外,有人建议你用SQL来做比较,这个建议可能不错。还有一个关于SQL的建议是,修正你的列类型——把所有的列都设为TEXT可能不是你想要的;在你的hashkey列上加个索引很可能是个好主意。

4

好吧,如果你唯一的问题是比较方面,那你可以试试:

if m.hexdigest() == row[0]:

因为row是一个元组而不是字符串,但我觉得你的基本思路有点问题。你是从数据库中为每一行获取hashkey,然后自己去找正确的那个。其实让数据库来帮你搜索会更好。数据库在搜索方面通常更厉害(因为它可能在hashkey字段上有索引——你有为这个字段创建索引吧?),这样它只需要给你发送一个结果,节省时间。所以你可以发出这样的查询来判断消息是否存在:

m.execute('select exists(select * from mail where hashkey=?)', m.hexdigest())

最后一点风格上的建议:Python有TrueFalse,所以没有必要用10来表示布尔值。

撰写回答