Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2019 13:30:02

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше прописать условие 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)

Мне нужно чтобы этот кусок кода не добавлял повторяющиеся новости в БД. А чтобы мой кусок кода не добавлял повторяющиеся новости.Нужно прописать такое условие if чтобы оно не добавлял повторяющиеся новости

Офлайн

#2 Авг. 30, 2019 11:09:48

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

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

Если я правильно понял, то не нужно добавлять имеющуюся в БД новость? Если так, то перед выполнением 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('Запись в базу данных успешно завершена!')
обернуть проверкой условия “вернул ли select пустоту”.

Офлайн

#3 Сен. 2, 2019 08:44:34

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Rafik
Если я правильно понял, то не нужно добавлять имеющуюся в БД новость? Если так, то перед выполнением insert необходимо сделать проверку наличия записи в БД. Т.е. выполнить select с условиями where по интересующим критериям. Если select вернет пустоту, тогда insert надо будет выполнить. Проще говоря, фрагмент
Благодарю ! Вы меня поняли

Офлайн

#4 Сен. 5, 2019 09:32:52

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

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

Вы, навеное, имели в виду как отсеять “лишние” данные перед обращением в БД? Если так, то предлагаю использовать словарь. В качестве ключа использовать критерии, по которым определяется уникальность новости. Если критериев несколько, то можно их объединить в одну строку, используя в качестве разделителя какой-либо символ или строку, который никогда не может быть в критериях.
Есть второй вариант. Зачем заморачиваться предварительным фильтрованием и проверкой наличия записи, когда всё это можно решить средствами БД? Запретить добавление в БД дублирующих записей. Например, в sqlite, можно создать индекс с ключом Unique. В этом случае БД выдаст ошибку при попытке добавления записи, если имеются в индексе добавляемые значения. Чтобы заглушить выдачу ошибки, в sqlite, применяется команда insert or ignore. В других БД, наверное, тоже имеется нечто подобное.

Отредактировано Rafik (Сен. 5, 2019 09:35:01)

Офлайн

#5 Сен. 5, 2019 09:35:38

r4khic
Зарегистрирован: 2019-07-23
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Rafik
Вы, навеное, имели в виду как отсеять “лишние” данные перед обращением в БД? Если так, то предлагаю использовать словарь. В качестве ключа использовать критерии, по которым определяется уникальность новости. Если критериев несколько, то можно их объединить в одну строку, используя в качестве разделителя какой-либо символ или строку, который никогда не может быть в критериях.Есть второй вариант. Зачем заморачиваться предварительным фильтрованием, когда можно средствами БД решить проблему? Запретить добавление в БД дублирующих записей. Например, в sqlite, можно создать индекс с ключом Unique. В этом случае БД выдаст ошибку при попытке добавления записи, если имеются в индексе добавляемые значения. Чтобы заглушить выдачу ошибки, в sqlite, применяется команда insert or ignore. В других БД, наверное, тоже имеется нечто подобное.
Благодарю вас за ответ ! Я уже нашел решение !

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version