fix(DB): Added data to new db structure
This commit is contained in:
1 parent
5d41a6b856
commit
2747214a74
1 file changed
+52
-331
+52
-331
@@ -1,13 +1,15 @@
|
|||||||
# InitializeDBData.py
|
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from loguru import logger as log
|
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 = conn.cursor()
|
||||||
|
cursor.execute('SELECT COUNT(*) FROM categories')
|
||||||
# Проверяем существование данных
|
|
||||||
cursor.execute('SELECT COUNT(*) FROM Category')
|
|
||||||
category_count = cursor.fetchone()[0]
|
category_count = cursor.fetchone()[0]
|
||||||
|
|
||||||
if category_count > 0:
|
if category_count > 0:
|
||||||
@@ -15,335 +17,54 @@ def add_products():
|
|||||||
conn.close()
|
conn.close()
|
||||||
return
|
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 = [
|
products_data = [
|
||||||
{
|
"Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х500",
|
||||||
'category_name': 'Труба ПВХ для ВНУТРЕННЕЙ канализации',
|
"Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х1000",
|
||||||
'category_description': 'цвет серый, со сплошной внутренней стенкой толщиной 2,2 мм',
|
"Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х1500",
|
||||||
'category_image': 'images/category_internal.jpg',
|
"Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х2000",
|
||||||
'products': [
|
"Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм 110х2,2х3000",
|
||||||
{
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х500",
|
||||||
'name': 'Труба ПВХ 110x2,2 2500мм',
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х1000",
|
||||||
'spec': '110x2,25000',
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х2000",
|
||||||
'image_path': 'images/internal_110_1.jpg',
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х3000",
|
||||||
'price': 98.00,
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN4 110х3,2х4000",
|
||||||
'quantity_per_package': 4,
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х1000",
|
||||||
'params': {
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х2000",
|
||||||
'Диаметр': '110 мм',
|
"Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости SN2 160х3,6х3000"
|
||||||
'Толщина стенки': '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'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Собираем все уникальные значения Val
|
added_products = 0
|
||||||
all_vals = {}
|
for product_text in products_data:
|
||||||
val_counter = 1
|
if "ВНУТРЕННЕЙ" in product_text:
|
||||||
|
category_id = internal_category_id
|
||||||
# Собираем все уникальные параметры
|
|
||||||
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 мм'
|
|
||||||
else:
|
else:
|
||||||
category_params['Класс жесткости'] = '8 мм'
|
category_id = external_category_id
|
||||||
|
|
||||||
# Добавляем CParams и связываем с категорией и значениями
|
product_id = add_product(conn, product_text, category_id)
|
||||||
for cparam_name, cparam_value in category_params.items():
|
if product_id:
|
||||||
# Добавляем CParam (без val_id)
|
added_products += 1
|
||||||
cursor.execute('INSERT INTO CParams (id, name) VALUES (?, ?)',
|
log.info(f"Добавлен товар: {product_text[:50]}...")
|
||||||
(cparams_counter, cparam_name))
|
else:
|
||||||
|
log.error(f"Ошибка при добавлении товара: {product_text}")
|
||||||
# Связываем категорию с 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']}")
|
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
total_products = product_counter - 1
|
log.success(f"Успешно добавлено {added_products} товаров в базу данных!")
|
||||||
total_categories = category_counter - 1
|
|
||||||
log.info(f"Успешно добавлено {total_products} товаров и {total_categories} категорий в базу данных!")
|
|
||||||
Reference in new issue
Block a user