Форум сайта python.su
0
Всем привет !
Есть код:
# < Запрос из таблицы items новостей для проверки. cursor.execute('SELECT `item_link` FROM `items` WHERE 1') item_link = cursor.fetchall() # < Вызов всех функций. def call_all_func(resources): # < Цикл для перебора из кортежа. for resource in resources: resource_name = resource[1] resource_link = resource[2] resource_url = resource[3] link_rule = resource[4] title_rule = resource[5] datetime_rule = resource[6] datetime1_rule = resource[7] text_rule = resource[8] text1_rule = resource[9] print(resource_name) resource_domain=resource_link # < Разбиваю данные из кортежа в массив. links_rule = link_rule.split(',') title_rule = title_rule.split(',') datetime_rule = datetime_rule.split(',') datetime1_rule = datetime1_rule.split(',') text_rule = text_rule.split(',') text1_rule = text1_rule.split(',') resource_page = get_html(resource_url) resource_links = get_resource_links(resource_page,links_rule,resource_domain) print('кол-во ссылок: '+str(len(resource_links))) # < Цикл для вызова функции. for resource_link in resource_links: item_page = get_html(resource_link) item_title = get_item_title(item_page,title_rule) item_datetime = get_item_datetime(item_page,datetime_rule,datetime1_rule) item_text_content = get_text_content(item_page,text_rule,text1_rule) # < Запись новостей в БД. sql = "insert into items (`item_link`,`item_title`,`item_datetime`,`item_text_content`) values (%s,%s,%s,%s)" cursor.execute(sql,(str(resource_link),str(item_title),str(item_datetime),str(item_text_content))) print('Запись в базу данных успешно завершена!') call_all_func(resources)
Офлайн
27
Если я правильно понял, то не нужно добавлять имеющуюся в БД новость? Если так, то перед выполнением insert необходимо сделать проверку наличия записи в БД. Т.е. выполнить select с условиями where по интересующим критериям. Если select вернет пустоту, тогда insert надо будет выполнить. Проще говоря, фрагмент
sql = "insert into items (`item_link`,`item_title`,`item_datetime`,`item_text_content`) values (%s,%s,%s,%s)" cursor.execute(sql,(str(resource_link),str(item_title),str(item_datetime),str(item_text_content))) print('Запись в базу данных успешно завершена!')
Офлайн
0
RafikБлагодарю ! Вы меня поняли
Если я правильно понял, то не нужно добавлять имеющуюся в БД новость? Если так, то перед выполнением insert необходимо сделать проверку наличия записи в БД. Т.е. выполнить select с условиями where по интересующим критериям. Если select вернет пустоту, тогда insert надо будет выполнить. Проще говоря, фрагмент
Офлайн
27
Вы, навеное, имели в виду как отсеять “лишние” данные перед обращением в БД? Если так, то предлагаю использовать словарь. В качестве ключа использовать критерии, по которым определяется уникальность новости. Если критериев несколько, то можно их объединить в одну строку, используя в качестве разделителя какой-либо символ или строку, который никогда не может быть в критериях.
Есть второй вариант. Зачем заморачиваться предварительным фильтрованием и проверкой наличия записи, когда всё это можно решить средствами БД? Запретить добавление в БД дублирующих записей. Например, в sqlite, можно создать индекс с ключом Unique. В этом случае БД выдаст ошибку при попытке добавления записи, если имеются в индексе добавляемые значения. Чтобы заглушить выдачу ошибки, в sqlite, применяется команда insert or ignore. В других БД, наверное, тоже имеется нечто подобное.
Отредактировано Rafik (Сен. 5, 2019 09:35:01)
Офлайн
0
RafikБлагодарю вас за ответ ! Я уже нашел решение !
Вы, навеное, имели в виду как отсеять “лишние” данные перед обращением в БД? Если так, то предлагаю использовать словарь. В качестве ключа использовать критерии, по которым определяется уникальность новости. Если критериев несколько, то можно их объединить в одну строку, используя в качестве разделителя какой-либо символ или строку, который никогда не может быть в критериях.Есть второй вариант. Зачем заморачиваться предварительным фильтрованием, когда можно средствами БД решить проблему? Запретить добавление в БД дублирующих записей. Например, в sqlite, можно создать индекс с ключом Unique. В этом случае БД выдаст ошибку при попытке добавления записи, если имеются в индексе добавляемые значения. Чтобы заглушить выдачу ошибки, в sqlite, применяется команда insert or ignore. В других БД, наверное, тоже имеется нечто подобное.
Офлайн