#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