我正在使用sqlite和python . 我正在实施POP3协议 . 我有一张 table
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 回答
好吧,如果您唯一的问题是比较,那么您可以尝试:
因为
row
是元组而不是字符串,但你的基本策略对我来说似乎不对 . 您正在为数据库中的每一行检索hashkey
,然后自己搜索正确的行 . 使数据库更好地搜索你 . 数据库可能更适合搜索(因为它可能在hashkey
字段上有一个索引 - 你确实为这个字段创建了一个索引,不是吗?)它只需要向你发送一个结果,从而节省时间 . 所以你可以发出这样的查询来确定消息是否存在:风格的最后一点:Python有
True
和False
,所以没有必要使用1
和0
作为布尔值 .可能会想让MySQL搜索哈希键:
主要问题是你试图将Python字符串(
m.hexdigest()
)与元组进行比较 .另外,另一张海报's suggestion that you use SQL for the comparison is probably good advice. Another SQL suggestion would be to fix your columns -- TEXT for everything probably isn' t你想要的;
hashkey
列上的索引很可能是一件好事 .