Сравнение значений sql - PullRequest
       0

Сравнение значений sql

0 голосов
/ 17 ноября 2010

Я использую sqlite с python. Я реализую протокол POP3. У меня есть стол

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

Теперь мне нужно проверить дубликаты сообщений, проверив идентификатор сообщения, извлеченного из существующих msg_id в таблице. Я зашифровал msg_id с помощью md5 и поместил его в столбец hashkey. Всякий раз, когда я получаю почту, я хэширую идентификатор сообщения и проверяю его по значениям таблицы. Вот что я делаю.


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

Он просто отказывается работать правильно. Я попытался напечатать значение строки, оно показывает его в юникоде, вот в чем проблема, поскольку он не может правильно сравниваться.

Есть ли лучший способ сделать это или улучшить мой метод?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Ну, если ваша единственная проблема связана со сравнением, вы можете попробовать:

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

, поскольку row - это кортеж, а не строка, но ваша базовая стратегия мне кажется неправильной. Вы извлекаете hashkey для каждой строки из базы данных, а затем делаете свой собственный поиск нужной. Гораздо лучше, чтобы база данных выполняла поиск за вас. Скорее всего, база данных будет лучше выполнять поиск (так как она, вероятно, имеет индекс в поле hashkey - вы создали индекс для этого поля, не так ли?), И она должна отправить вам только один результат, сохранив время. Таким образом, вы можете выполнить такой запрос, чтобы определить, существует ли сообщение:

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

Последняя точка стиля: Python имеет True и False, поэтому нет необходимости использовать 1 и 0 для логических значений.

0 голосов
/ 17 ноября 2010

Основная проблема заключается в том, что вы пытаетесь сравнить строку Python (m.hexdigest()) с кортежем.

Кроме того, рекомендация другого автора о том, что вы используете SQL для сравнения, вероятно, является хорошим советом. Другое предложение SQL было бы исправить ваши столбцы - ТЕКСТ для всего, вероятно, не то, что вы хотите; индекс в вашем столбце hashkey, скорее всего, хорошая вещь.

0 голосов
/ 17 ноября 2010

Может быть, стоит попросить MySQL найти ключ хеша:

select count(*) from mail where hashkey = 'TheHashKey'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...