diff --git a/ensure_db.py b/ensure_db.py index 3734298..30c5b53 100644 --- a/ensure_db.py +++ b/ensure_db.py @@ -160,7 +160,8 @@ def ensure_database_structure(): CREATE TABLE categories ( AUTO_ID INT AUTO_INCREMENT PRIMARY KEY, ID VARCHAR(255), - TITLE VARCHAR(2048) + TITLE VARCHAR(2048), + description TEXT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ''' } @@ -220,6 +221,9 @@ def ensure_database_structure(): ], 'interlinks': [ {'column': 'auto_added', 'type': 'BOOLEAN DEFAULT 0'} + ], + 'categories': [ + {'column': 'description', 'type': 'TEXT'} ] } diff --git a/volk_load.py b/volk_load.py index 27c39cf..0ea7535 100644 --- a/volk_load.py +++ b/volk_load.py @@ -12,6 +12,7 @@ from ensure_db import ensure_database_structure load_dotenv() VOLK_CATEGORY_LIST = os.getenv('VOLK_CATEGORY_LIST') +VOLK_CATEGORY_DESC_PREFIX = os.getenv('VOLK_CATEGORY_DESC_PREFIX') VOLK_API_VERSION = os.getenv('VOLK_API_VERSION') MDB_HOST = os.getenv('MDB_HOST') MDB_USER = os.getenv('MDB_USER') @@ -98,6 +99,9 @@ def load_categories(): log_message("Проверка структуры базы данных") ensure_database_structure() + # Список категорий для последующей загрузки описаний + loaded_categories = [] + for item in categories_data: # Проверка обязательного поля ID if 'id' not in item or not item['id']: @@ -119,8 +123,8 @@ def load_categories(): if not existing: # Вставка новой записи cursor.execute( - "INSERT INTO categories (ID, TITLE) VALUES (%s, %s)", - (category_id, title) + "INSERT INTO categories (ID, TITLE, description) VALUES (%s, %s, %s)", + (category_id, title, None) ) inserted_count += 1 log_message(f"Добавление: Категория {category_id}, Название: {title if title else '(пусто)'}") @@ -137,6 +141,69 @@ def load_categories(): log_message(f"Категория {category_id} без изменений") connection.commit() + loaded_categories.append(category_id) + + log_message(f"Загружено категорий: {len(loaded_categories)}. Добавлено записей: {inserted_count}. Обновлено записей: {updated_count}.") + + # Загрузка описаний категорий + if VOLK_CATEGORY_DESC_PREFIX and loaded_categories: + log_message(f"Начало загрузки описаний для {len(loaded_categories)} категорий") + desc_updated_count = 0 + + for category_id in loaded_categories: + try: + desc_url = VOLK_CATEGORY_DESC_PREFIX + category_id + log_message(f"Запрос описания для категории {category_id} из {desc_url}") + + with urlopen(desc_url) as response: + desc_response = json.loads(response.read().decode()) + + # Проверка версии API + api_version = desc_response.get('api_version') + if api_version != VOLK_API_VERSION: + error_msg = f"Несовпадение версии API при загрузке описания категории {category_id}: получена версия '{api_version}', ожидается '{VOLK_API_VERSION}'. Обработка остановлена." + log_message(error_msg, "ERROR") + print(error_msg) + # Останавливаем обработку + break + + # Проверка наличия блока data + if 'data' not in desc_response: + error_msg = f"В JSON ответе для категории {category_id} отсутствует блок 'data'. Обработка остановлена." + log_message(error_msg, "ERROR") + print(error_msg) + # Останавливаем обработку + break + + desc_data = desc_response['data'] + + # Получаем description из блока data + description = desc_data.get('description') + # Если description пустое, None или отсутствует, обнуляем поле в БД + if not description: + description = None + + # Обновляем описание в базе данных + cursor.execute( + "UPDATE categories SET description = %s WHERE ID = %s", + (description, category_id) + ) + connection.commit() + desc_updated_count += 1 + + if description: + log_message(f"Обновлено описание для категории {category_id}") + else: + log_message(f"Описание для категории {category_id} обнулено (пустое или отсутствует)") + + except Exception as e: + error_msg = f"Ошибка при загрузке описания для категории {category_id}: {e}" + log_message(error_msg, "ERROR") + print(error_msg) + # Останавливаем обработку при ошибке + break + + log_message(f"Завершение загрузки описаний. Обновлено описаний: {desc_updated_count}.") log_message(f"Завершение работы. Добавлено записей: {inserted_count}. Обновлено записей: {updated_count}.")