【问题标题】:Comparing sql values比较sql值
【发布时间】:2011-05-11 14:59:12
【问题描述】:

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

msg_id 文本 日期文本 from_sender 文本 主题文本 文章主体 哈希键文本

现在我需要通过对照表中现有的 msg_id 检查检索到的消息的消息 ID 来检查重复消息。我使用 md5 加密了 msg_id 并将其放在 hashkey 列中。每当我检索邮件时,我都会对邮件 ID 进行哈希处理并使用表值进行检查。这就是我的工作。

def check_duplicate(新): conn = sql.connect("邮件") c = conn.cursor() m = hashlib.md5() m.update(新) c.execute("从邮件中选择 hashkey") 对于 c 中的行: 如果 m.hexdigest() == 行: 返回 0 别的: 继续 返回 1

它只是拒绝正常工作。我尝试打印行值,它以 unicode 显示,这就是问题所在,因为它无法正确比较。

有没有更好的方法来做到这一点,或者改进我的方法?

【问题讨论】:

  • 只是好奇 - 为什么在进行比较之前对 ms​​g_id 字段进行哈希处理?有什么原因你不能比较 msg_id 的吗?
  • @Bob: O(1) 与表中现有字符串的每次比较。 (而不是 O(n)。)这称为实习字符串,请参阅:en.wikipedia.org/wiki/String_interning
  • 另外:MD5 是一种哈希算法,而不是“加密”。您正在对 msg_id 进行哈希处理,而不是对其进行加密。

标签: python sql sqlite


【解决方案1】:

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

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

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

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

风格的最后一点:Python 有TrueFalse,因此不需要使用10 来表示布尔值。

【讨论】:

  • 虽然奇​​怪的是,它并不总是有真假。所以你可以做一些有趣的事情,比如(False + 1) == 1,这是真的。 =)
【解决方案2】:

让 MySQL 搜索哈希键可能是一个想法:

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

【讨论】:

    【解决方案3】:

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

    此外,另一位发帖人建议您使用 SQL 进行比较可能是个好建议。另一个 SQL 建议是修复您的列——所有内容的 TEXT 可能不是您想要的; hashkey 列上的索引很可能是一件好事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多