diff --git a/db/InitializeDBData.py b/db/InitializeDBData.py index 4b7f42d..0266a5a 100644 --- a/db/InitializeDBData.py +++ b/db/InitializeDBData.py @@ -1,13 +1,15 @@ -# InitializeDBData.py import sqlite3 from loguru import logger as log +from db.DBDataUtils import add_category, add_filter, add_product, parse_product_data +from db.InitializeDB import init_database -def add_products(): - conn = sqlite3.connect('products.db') + +def init_tables(db_name='pipe_store.db'): + init_database(db_name) + + conn = sqlite3.connect(db_name) cursor = conn.cursor() - - # Проверяем существование данных - cursor.execute('SELECT COUNT(*) FROM Category') + cursor.execute('SELECT COUNT(*) FROM categories') category_count = cursor.fetchone()[0] if category_count > 0: @@ -15,335 +17,54 @@ def add_products(): conn.close() return - # Данные из прайс-листа + log.info("Начинаем заполнение базы данных...") + + main_category_id = add_category(conn, "Трубы ПВХ", "Трубы ПВХ для канализации") + internal_category_id = add_category(conn, "Для внутренней канализации", "Трубы для внутренней канализации", main_category_id) + external_category_id = add_category(conn, "Для наружной канализации", "Трубы для наружной канализации", main_category_id) + + log.info("Категории созданы успешно") + + add_filter(conn, "Диаметр", "diameter", "multiple") + add_filter(conn, "Длина", "length", "multiple") + add_filter(conn, "Тип применения", "application_type", "single") + add_filter(conn, "Цвет", "color", "single") + add_filter(conn, "Класс жесткости", "stiffness_class", "single") + add_filter(conn, "Толщина стенки", "wall_thickness", "multiple") + + log.info("Фильтры добавлены успешно") + products_data = [ - { - 'category_name': 'Труба ПВХ для ВНУТРЕННЕЙ канализации', - 'category_description': 'цвет серый, со сплошной внутренней стенкой толщиной 2,2 мм', - 'category_image': 'images/category_internal.jpg', - 'products': [ - { - 'name': 'Труба ПВХ 110x2,2 2500мм', - 'spec': '110x2,25000', - 'image_path': 'images/internal_110_1.jpg', - 'price': 98.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '2.2 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'серый', - 'Назначение': 'внутренняя канализация' - } - }, - { - 'name': 'Труба ПВХ 110x2,2 2500мм', - 'spec': '110x2,25000', - 'image_path': 'images/internal_110_2.jpg', - 'price': 165.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '2.2 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'серый', - 'Назначение': 'внутренняя канализация' - } - }, - { - 'name': 'Труба ПВХ 110x2,2 2500мм', - 'spec': '110x2,25000', - 'image_path': 'images/internal_110_3.jpg', - 'price': 236.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '2.2 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'серый', - 'Назначение': 'внутренняя канализация' - } - }, - { - 'name': 'Труба ПВХ 110x2,2 2500мм', - 'spec': '110x2,25000', - 'image_path': 'images/internal_110_4.jpg', - 'price': 284.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '2.2 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'серый', - 'Назначение': 'внутренняя канализация' - } - }, - { - 'name': 'Труба ПВХ 110x2,2 2500мм', - 'spec': '110x2,25000', - 'image_path': 'images/internal_110_5.jpg', - 'price': 426.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '2.2 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'серый', - 'Назначение': 'внутренняя канализация' - } - } - ] - }, - { - 'category_name': 'Труба ПВХ для НАРУЖНОЙ канализации', - 'category_description': 'цвет коричнево-оранжевый, со сплошной внутренней стенкой, класс жесткости 8мм', - 'category_image': 'images/category_external.jpg', - 'products': [ - { - 'name': 'Труба ПВХ 110x3,0 2500мм', - 'spec': '110x3,25000', - 'image_path': 'images/external_110_1.jpg', - 'price': 125.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм' - } - }, - { - 'name': 'Труба ПВХ 110x3,0 2500мм', - 'spec': '110x3,25000', - 'image_path': 'images/external_110_2.jpg', - 'price': 220.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм' - } - }, - { - 'name': 'Труба ПВХ 110x3,0 2500мм', - 'spec': '110x3,25000', - 'image_path': 'images/external_110_3.jpg', - 'price': 380.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм' - } - }, - { - 'name': 'Труба ПВХ 110x3,0 2500мм', - 'spec': '110x3,25000', - 'image_path': 'images/external_110_4.jpg', - 'price': 585.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм' - } - }, - { - 'name': 'Труба ПВХ 110x3,0 2500мм', - 'spec': '110x3,25000', - 'image_path': 'images/external_110_5.jpg', - 'price': 780.00, - 'quantity_per_package': 4, - 'params': { - 'Диаметр': '110 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '2500 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм' - } - }, - { - 'name': 'Труба ПВХ 160x3,0 5000мм SM 2', - 'spec': '160x3,50000 SM 2', - 'image_path': 'images/external_160_1.jpg', - 'price': 398.00, - 'quantity_per_package': 2, - 'params': { - 'Диаметр': '160 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '5000 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм', - 'Маркировка': 'SM 2' - } - }, - { - 'name': 'Труба ПВХ 160x3,0 5000мм SM 2', - 'spec': '160x3,50000 SM 2', - 'image_path': 'images/external_160_2.jpg', - 'price': 724.00, - 'quantity_per_package': 2, - 'params': { - 'Диаметр': '160 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '5000 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм', - 'Маркировка': 'SM 2' - } - }, - { - 'name': 'Труба ПВХ 160x3,0 5000мм SM 2', - 'spec': '160x3,50000 SM 2', - 'image_path': 'images/external_160_3.jpg', - 'price': 1068.00, - 'quantity_per_package': 2, - 'params': { - 'Диаметр': '160 мм', - 'Толщина стенки': '3.0 мм', - 'Длина': '5000 мм', - 'Тип': 'со сплошной внутренней стенкой', - 'Цвет': 'коричнево-оранжевый', - 'Назначение': 'наружная канализация', - 'Класс жесткости': '8 мм', - 'Маркировка': 'SM 2' - } - } - ] - } + "Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х500", + "Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х1000", + "Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х1500", + "Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х2000", + "Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х3000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х500", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х1000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х2000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х3000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х4000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х1000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х2000", + "Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х3000" ] - # Собираем все уникальные значения Val - all_vals = {} - val_counter = 1 - - # Собираем все уникальные параметры - all_params = {} - param_counter = 1 - - # Сначала собираем все уникальные значения - for category_data in products_data: - for product in category_data['products']: - for param_value in product['params'].values(): - if param_value not in all_vals: - all_vals[param_value] = val_counter - val_counter += 1 - - # Добавляем значения в таблицу Val - for val_text, val_id in all_vals.items(): - cursor.execute('INSERT INTO Val (id, val) VALUES (?, ?)', (val_id, val_text)) - log.info(f"Добавлено значение: {val_text} (id: {val_id})") - - # Собираем все уникальные параметры (Param) - for category_data in products_data: - for product in category_data['products']: - for param_name, param_value in product['params'].items(): - key = f"{param_name}_{param_value}" - if key not in all_params: - all_params[key] = {'id': param_counter, 'name': param_name, 'val': param_value} - param_counter += 1 - - # Добавляем параметры в таблицу Param - for key, param in all_params.items(): - cursor.execute('INSERT INTO Param (id, name, val) VALUES (?, ?, ?)', - (param['id'], param['name'], param['val'])) - log.info(f"Добавлен параметр: {param['name']} = {param['val']}") - - # Добавляем категории, CParams и связи - category_counter = 1 - product_counter = 1 - cparams_counter = 1 - - for category_data in products_data: - # Добавляем категорию - cursor.execute(''' - INSERT INTO Category (id, name, image_path) - VALUES (?, ?, ?) - ''', (category_counter, category_data['category_name'], category_data['category_image'])) - - category_id = category_counter - - # Создаем CParams для категории и связываем с значениями - category_params = { - 'Назначение': 'внутренняя канализация' if 'ВНУТРЕННЕЙ' in category_data['category_name'] else 'наружная канализация', - 'Цвет': 'серый' if 'ВНУТРЕННЕЙ' in category_data['category_name'] else 'коричнево-оранжевый', - 'Тип': 'со сплошной внутренней стенкой' - } - - if 'ВНУТРЕННЕЙ' in category_data['category_name']: - category_params['Толщина стенки'] = '2.2 мм' + added_products = 0 + for product_text in products_data: + if "ВНУТРЕННЕЙ" in product_text: + category_id = internal_category_id else: - category_params['Класс жесткости'] = '8 мм' - - # Добавляем CParams и связываем с категорией и значениями - for cparam_name, cparam_value in category_params.items(): - # Добавляем CParam (без val_id) - cursor.execute('INSERT INTO CParams (id, name) VALUES (?, ?)', - (cparams_counter, cparam_name)) - - # Связываем категорию с CParams - cursor.execute('INSERT INTO Category_CParams (category_id, cparams_id) VALUES (?, ?)', - (category_id, cparams_counter)) - - # Связываем CParams с Val (многие-ко-многим) - if cparam_value in all_vals: - val_id = all_vals[cparam_value] - cursor.execute('INSERT INTO CParams_Val (cparams_id, val_id) VALUES (?, ?)', - (cparams_counter, val_id)) - - log.info(f"Добавлен CParam: {cparam_name} со значением {cparam_value} для категории {category_data['category_name']}") - cparams_counter += 1 - - # Добавляем продукты категории - for product in category_data['products']: - # Добавляем продукт - cursor.execute('INSERT INTO Product (id, name, image_path) VALUES (?, ?, ?)', - (product_counter, product['name'], product['image_path'])) - product_id = product_counter - - # Добавляем связи продукт-параметры - for param_name, param_value in product['params'].items(): - param_key = f"{param_name}_{param_value}" - if param_key in all_params: - param_id = all_params[param_key]['id'] - cursor.execute('INSERT INTO Product_Param (product_id, param_id) VALUES (?, ?)', - (product_id, param_id)) - - product_counter += 1 - log.info(f"Добавлен продукт: {product['name']}") - - category_counter += 1 - log.info(f"Добавлена категория: {category_data['category_name']}") - + category_id = external_category_id + + product_id = add_product(conn, product_text, category_id) + if product_id: + added_products += 1 + log.info(f"Добавлен товар: {product_text[:50]}...") + else: + log.error(f"Ошибка при добавлении товара: {product_text}") + conn.commit() conn.close() - total_products = product_counter - 1 - total_categories = category_counter - 1 - log.info(f"Успешно добавлено {total_products} товаров и {total_categories} категорий в базу данных!") + log.success(f"Успешно добавлено {added_products} товаров в базу данных!")