我正在使用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显示,这就是问题所在,因为它无法正确比较。
有更好的方法可以做到这一点,还是改进我的方法?
答案 0 :(得分:3)
好吧,如果您唯一的问题是比较,那么您可以尝试:
if m.hexdigest() == row[0]:
因为row
是元组而不是字符串,但你的基本策略对我来说似乎不对。您正在为数据库中的每一行检索hashkey
,然后自己搜索正确的行。使数据库更好地搜索你。数据库可能在搜索方面更好(因为它可能在hashkey
字段上有一个索引 - 你确实为这个字段创建了一个索引,不是吗?)它只需要向你发送一个结果, 节约时间。因此,您可以发出这样的查询来确定消息是否存在:
m.execute('select exists(select * from mail where hashkey=?)', m.hexdigest())
风格的最后一点:Python有True
和False
,所以没有必要使用1
和0
来表示布尔值。
答案 1 :(得分:0)
可能要求MySQL搜索哈希密钥:
select count(*) from mail where hashkey = 'TheHashKey'
答案 2 :(得分:0)
主要问题是你试图将Python字符串(m.hexdigest()
)与元组进行比较。
此外,另一张海报建议您使用SQL进行比较可能是个好建议。另一个SQL建议是修复你的列 - TEXT用于所有可能不是你想要的东西;您的hashkey
列上的索引很可能是一件好事。