fix(DB): Added data to new db structure

This commit is contained in:
Kirill committed 2025-11-29 14:35:16 +03:00
1 parent 5d41a6b856
commit 2747214a74
1 file changed
+50 -329
+50 -329
View File
@@ -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 мм'
category_id = external_category_id
# Добавляем 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']}")
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} товаров в базу данных!")