Пытаюсь проверить, есть ли значение уже в базе данных MySQL

#python #mysql #mysql-python

#python #mysql #mysql-python

Вопрос:

Я пишу скрипт, который будет запускаться каждые 20 минут, который ищет файлы для загрузки, но я хочу проверить, загрузил ли я уже файл: сначала мой код выполняет эту команду:

 cursor.execute("SELECT `file_id` FROM `reports`")
file_ids = list(cursor.fetchall())
  

file_ids — это более длинная версия этого:

 [('735724',), ('734791',), ('735934',), ('735486',)]
  

Я написал эту функцию, чтобы проверить, загрузил ли я уже файл:

 def new_file(file):
    file = "('%s',)" % (file)
    if (file in file_ids):
        print "true"
    else:
        print "false"   
  

Когда я пытаюсь протестировать функцию:

 file = "735724"
new_file(file)
  

Он последовательно выводит false.

Что я делаю не так?

Я знаю, что я мог бы запустить инструкцию MySQL для каждого идентификатора файла, чтобы узнать, есть ли у меня файл, но поскольку для проверки нужны тысячи файлов, я предположил, что это будет быстрее. Если я ошибаюсь в этом, пожалуйста, не стесняйтесь поправить меня.

Комментарии:

1. измените file = "('%s',)" % (file) на file = (file,) , и ваш код будет работать так, как написано.

Ответ №1:

Результаты из базы данных — это не строка, это список кортежей. Что вы, вероятно, хотите сделать, это создать список только с идентификаторами, а затем проверить, есть ли это числовое значение в списке. Например:

 file_ids = [row[0] for row in cursor.fetchall()]
is_in_list = test_id in file_ids
if is_in_list:
    print "true"
  

Комментарии:

1. Возможное улучшение производительности : file_ids = set(row[0] for row in cursor.fetchall()) . Это ускоряет проверку членства.

2. jimstandard также может переписать запрос, чтобы он просто извлекал то, что ему нужно. WHERE FILE_ID NOT IN ('735724','735728') и т.д. Или запись, полученная file_ids в выделенной таблице.

Ответ №2:

вам не нужно преобразовывать все в строку. попробуйте:

 def new_file(file):
  return (file, ) not in file_ids