r4khic
@r4khic
Начинающий кодер на python

Как лучше прописать условие if?

Всем привет !
Есть код
# < Запрос из таблицы 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)


Мне нужно чтобы этот кусок кода не добавлял повторяющиеся новости в БД. А чтобы мой кусок кода не добавлял повторяющиеся новости.Мне нужно одну новость из resource_link проверять в запросе item_links.После проверки если этой новости нету,то тогда новость стоит добавлять.Вот такое мне нужно условие,а как его реализовать,я не знаю.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
@Andrey_Dolg
Пользуйтесь либо возможностями sql и делайте все одной транзакцией с условием not in. Либо используйте функцию filter
links = list(filter(lambda x: x not in alredy_exsist_links, parsed_links))

, либо используйте вычитание одного множества из другого. Как-то так. На счет if ну можно сделать
if new_link in already_exists_links:
    continue
просто цикл работать будет дольше.
Хотя я честно скажу что не знаю как множества работают под капотом с памятью и проверкой значений, но в коде это смотрится на порядок понятней.
new_links = set(parsed_links)
old_links = set(links_from_db)
links_for_insert = new_links - old_links

Если есть замечания по filter и set буду рад услышать. =)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@deliro
Агрессивное программирование
Берёшь весь кортеж своих переменных и суёшь его в set. Перед этим проверяешь, что такого нет:

exists = set()

for ... in ...:
    for ... in ...:
        params = str(resource_link),str(item_title),str(item_datetime),str(item_text_content)
        if params not in exists:
            exists.add(params)
            cursor.execute(sql, params)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы