比较SQL值
我正在用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有True
和False
,所以没有必要用1
和0
来表示布尔值。