比较sql值

时间:2010-11-17 19:08:44

标签: python sql sqlite

我正在使用sqlite和python。我正在实施POP3协议。我有一张桌子

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

现在,我需要通过检查针对表中现有msg_id检索的消息的消息ID来检查重复消息。我使用md5加密了msg_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 :(得分:3)

好吧,如果您唯一的问题是比较,那么您可以尝试:

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

因为row是元组而不是字符串,但你的基本策略对我来说似乎不对。您正在为数据库中的每一行检索hashkey,然后自己搜索正确的行。使数据库更好地搜索你。数据库可能在搜索方面更好(因为它可能在hashkey字段上有一个索引 - 你确实为这个字段创建了一个索引,不是吗?)它只需要向你发送一个结果, 节约时间。因此,您可以发出这样的查询来确定消息是否存在:

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

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

答案 1 :(得分:0)

可能要求MySQL搜索哈希密钥:

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

答案 2 :(得分:0)

主要问题是你试图将Python字符串(m.hexdigest())与元组进行比较。

此外,另一张海报建议您使用SQL进行比较可能是个好建议。另一个SQL建议是修复你的列 - TEXT用于所有可能不是你想要的东西;您的hashkey列上的索引很可能是一件好事。