Reviewed-on: https://git.rustprogersteam.ru/PVHProject/PVHBackend/pulls/4
This commit is contained in:
commit
87392869b1
7 files changed
+413
-57
No files matched your search
+52
-13
@@ -1,28 +1,67 @@
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import json
|
|
||||||
from loguru import logger as log
|
from loguru import logger as log
|
||||||
|
|
||||||
def init_database():
|
def init_database():
|
||||||
conn = sqlite3.connect('products.db')
|
conn = sqlite3.connect('products.db')
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
cursor.execute('''
|
# Создаем таблицу Product
|
||||||
CREATE TABLE IF NOT EXISTS Category (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL UNIQUE,
|
|
||||||
atributes TEXT NOT NULL
|
|
||||||
)
|
|
||||||
''')
|
|
||||||
|
|
||||||
cursor.execute('''
|
cursor.execute('''
|
||||||
CREATE TABLE IF NOT EXISTS Product (
|
CREATE TABLE IF NOT EXISTS Product (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
category INTEGER NOT NULL,
|
image_path TEXT
|
||||||
desc TEXT,
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Создаем таблицу Param
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS Param (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
val TEXT NOT NULL
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Создаем таблицу Val
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS Val (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
val TEXT NOT NULL
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Создаем таблицу CParams
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS CParams (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
val_id INTEGER,
|
||||||
|
FOREIGN KEY (val_id) REFERENCES Val (id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Создаем таблицу Category
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS Category (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
prod_id INTEGER,
|
||||||
image_path TEXT,
|
image_path TEXT,
|
||||||
size TEXT,
|
c_params_id INTEGER,
|
||||||
FOREIGN KEY (category) REFERENCES Category (id)
|
FOREIGN KEY (prod_id) REFERENCES Product (id),
|
||||||
|
FOREIGN KEY (c_params_id) REFERENCES CParams (id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Создаем таблицу Product_Param (связь многие-ко-многим)
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS Product_Param (
|
||||||
|
product_id INTEGER,
|
||||||
|
param_id INTEGER,
|
||||||
|
PRIMARY KEY (product_id, param_id),
|
||||||
|
FOREIGN KEY (product_id) REFERENCES Product (id),
|
||||||
|
FOREIGN KEY (param_id) REFERENCES Param (id)
|
||||||
)
|
)
|
||||||
''')
|
''')
|
||||||
|
|
||||||
|
|||||||
+335
-40
@@ -1,60 +1,355 @@
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import json
|
|
||||||
from loguru import logger as log
|
from loguru import logger as log
|
||||||
|
|
||||||
def add_products():
|
def add_products():
|
||||||
conn = sqlite3.connect('products.db')
|
conn = sqlite3.connect('products.db')
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Проверяем существование данных
|
||||||
cursor.execute('SELECT COUNT(*) FROM Category')
|
cursor.execute('SELECT COUNT(*) FROM Category')
|
||||||
category_count = cursor.fetchone()[0]
|
category_count = cursor.fetchone()[0]
|
||||||
|
|
||||||
if category_count > 0:
|
if category_count > 0:
|
||||||
log.info("Категории уже существуют в базе данных, пропускаем добавление")
|
log.info("Данные уже существуют в базе данных, пропускаем добавление")
|
||||||
conn.close()
|
conn.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
categories_data = [
|
# Данные из прайс-листа
|
||||||
('Внутренняя канализация', [["Диаметр", "string"], ["Длина", "string"], ["Толщина стенки", "string"], ["Цвет", "string"]]),
|
|
||||||
('Наружная канализация', [["Диаметр", "string"], ["Длина", "string"], ["Толщина стенки", "string"], ["Класс жесткости", "string"], ["Цвет", "string"]])
|
|
||||||
]
|
|
||||||
|
|
||||||
category_ids = {}
|
|
||||||
for name, atributes in categories_data:
|
|
||||||
atributes_json = json.dumps(atributes)
|
|
||||||
cursor.execute(
|
|
||||||
'INSERT INTO Category (name, atributes) VALUES (?, ?)',
|
|
||||||
(name, atributes_json)
|
|
||||||
)
|
|
||||||
category_ids[name] = cursor.lastrowid
|
|
||||||
log.info(f"Добавлена категория: {name}")
|
|
||||||
|
|
||||||
products_data = [
|
products_data = [
|
||||||
('Труба ПВХ 110x2,25000', 'Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм. Размер: 110x2,25000. Количество в упаковке: 4 шт.', 'images/internal_110_1.jpg', '110x2,25000', 'Внутренняя канализация'),
|
{
|
||||||
('Труба ПВХ 110x2,25000', 'Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм. Размер: 110x2,25000. Количество в упаковке: 4 шт.', 'images/internal_110_2.jpg', '110x2,25000', 'Внутренняя канализация'),
|
'category_name': 'Труба ПВХ для ВНУТРЕННЕЙ канализации',
|
||||||
('Труба ПВХ 110x2,25000', 'Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм. Размер: 110x2,25000. Количество в упаковке: 4 шт.', 'images/internal_110_3.jpg', '110x2,25000', 'Внутренняя канализация'),
|
'category_description': 'цвет серый, со сплошной внутренней стенкой толщиной 2,2 мм',
|
||||||
('Труба ПВХ 110x2,25000', 'Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм. Размер: 110x2,25000. Количество в упаковке: 4 шт.', 'images/internal_110_4.jpg', '110x2,25000', 'Внутренняя канализация'),
|
'category_image': 'images/category_internal.jpg',
|
||||||
('Труба ПВХ 110x2,25000', 'Труба ПВХ для ВНУТРЕННЕЙ канализации (цвет серый), со сплошной внутренней стенкой толщиной 2,2 мм. Размер: 110x2,25000. Количество в упаковке: 4 шт.', 'images/internal_110_5.jpg', '110x2,25000', 'Внутренняя канализация'),
|
'products': [
|
||||||
('Труба ПВХ 110x3,25000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 110x3,25000. Количество в упаковке: 4 шт.', 'images/external_110_1.jpg', '110x3,25000', 'Наружная канализация'),
|
{
|
||||||
('Труба ПВХ 110x3,25000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 110x3,25000. Количество в упаковке: 4 шт.', 'images/external_110_2.jpg', '110x3,25000', 'Наружная канализация'),
|
'name': 'Труба ПВХ 110x2,2 2500мм',
|
||||||
('Труба ПВХ 110x3,25000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 110x3,25000. Количество в упаковке: 4 шт.', 'images/external_110_3.jpg', '110x3,25000', 'Наружная канализация'),
|
'spec': '110x2,25000',
|
||||||
('Труба ПВХ 110x3,25000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 110x3,25000. Количество в упаковке: 4 шт.', 'images/external_110_4.jpg', '110x3,25000', 'Наружная канализация'),
|
'image_path': 'images/internal_110_1.jpg',
|
||||||
('Труба ПВХ 110x3,25000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 110x3,25000. Количество в упаковке: 4 шт.', 'images/external_110_5.jpg', '110x3,25000', 'Наружная канализация'),
|
'price': 98.00,
|
||||||
('Труба ПВХ 160x3,50000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 160x3,50000. Количество в упаковке: 2 шт.', 'images/external_160_1.jpg', '160x3,50000', 'Наружная канализация'),
|
'quantity_per_package': 4,
|
||||||
('Труба ПВХ 160x3,50000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 160x3,50000. Количество в упаковке: 2 шт.', 'images/external_160_2.jpg', '160x3,50000', 'Наружная канализация'),
|
'params': {
|
||||||
('Труба ПВХ 160x3,50000', 'Труба ПВХ для НАРУЖНОЙ канализации (цвет коричнево-оранжевый), со сплошной внутренней стенкой, класс жесткости 8мм. Размер: 160x3,50000. Количество в упаковке: 2 шт.', 'images/external_160_3.jpg', '160x3,50000', 'Наружная канализация'),
|
'Диаметр': '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'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
for name, desc, image_path, size, category_name in products_data:
|
# Собираем все уникальные значения Val
|
||||||
cursor.execute('SELECT id FROM Category WHERE name = ?', (category_name,))
|
all_vals = {}
|
||||||
category_row = cursor.fetchone()
|
val_counter = 1
|
||||||
if category_row:
|
|
||||||
category_id = category_row[0]
|
# Собираем все уникальные параметры
|
||||||
cursor.execute(
|
all_params = {}
|
||||||
'INSERT INTO Product (name, category, desc, image_path, size) VALUES (?, ?, ?, ?, ?)',
|
param_counter = 1
|
||||||
(name, category_id, desc, image_path, size)
|
|
||||||
)
|
# Сначала собираем все уникальные значения
|
||||||
|
for category_data in products_data:
|
||||||
|
# Собираем значения из params продуктов
|
||||||
|
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:
|
||||||
|
val_id = all_vals[param_value]
|
||||||
|
all_params[key] = {'id': param_counter, 'name': param_name, 'val_id': val_id}
|
||||||
|
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_value))
|
||||||
|
log.info(f"Добавлен параметр: {param['name']} = {param_value}")
|
||||||
|
|
||||||
|
# Добавляем категории, продукты и связи
|
||||||
|
category_counter = 1
|
||||||
|
product_counter = 1
|
||||||
|
|
||||||
|
for category_data in products_data:
|
||||||
|
# Создаем CParams для категории (основные характеристики категории)
|
||||||
|
cparams_ids = []
|
||||||
|
|
||||||
|
# Основные параметры категории из описания
|
||||||
|
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:
|
||||||
|
category_params['Класс жесткости'] = '8 мм'
|
||||||
|
|
||||||
|
for cparam_name, cparam_value in category_params.items():
|
||||||
|
if cparam_value in all_vals:
|
||||||
|
val_id = all_vals[cparam_value]
|
||||||
|
cursor.execute('INSERT INTO CParams (name, val_id) VALUES (?, ?)',
|
||||||
|
(cparam_name, val_id))
|
||||||
|
cparams_ids.append(cursor.lastrowid)
|
||||||
|
log.info(f"Добавлен категорийный параметр: {cparam_name} = {cparam_value}")
|
||||||
|
|
||||||
|
# Основной c_params_id для категории (берем первый)
|
||||||
|
main_cparams_id = cparams_ids[0] if cparams_ids else None
|
||||||
|
|
||||||
|
# Добавляем категорию (пока без prod_id)
|
||||||
|
cursor.execute('''
|
||||||
|
INSERT INTO Category (name, prod_id, image_path, c_params_id)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
''', (category_data['category_name'], None,
|
||||||
|
category_data['category_image'], main_cparams_id))
|
||||||
|
|
||||||
|
category_id = cursor.lastrowid
|
||||||
|
|
||||||
|
# Добавляем продукты категории
|
||||||
|
first_product_id = None
|
||||||
|
for product in category_data['products']:
|
||||||
|
# Добавляем продукт
|
||||||
|
cursor.execute('INSERT INTO Product (name, image_path) VALUES (?, ?)',
|
||||||
|
(product['name'], product['image_path']))
|
||||||
|
product_id = cursor.lastrowid
|
||||||
|
|
||||||
|
# Сохраняем ID первого продукта для связи с категорией
|
||||||
|
if first_product_id is None:
|
||||||
|
first_product_id = product_id
|
||||||
|
|
||||||
|
# Добавляем связи продукт-параметры
|
||||||
|
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']} (цена: {product['price']} руб., упаковка: {product['quantity_per_package']} шт.)")
|
||||||
|
|
||||||
|
# Обновляем prod_id для категории (первый продукт как представитель)
|
||||||
|
if first_product_id:
|
||||||
|
cursor.execute('UPDATE Category SET prod_id = ? WHERE id = ?',
|
||||||
|
(first_product_id, category_id))
|
||||||
|
|
||||||
|
category_counter += 1
|
||||||
|
log.info(f"Добавлена категория: {category_data['category_name']}")
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
log.info(f"Добавлено {len(products_data)} товаров в базу данных!")
|
|
||||||
|
total_products = product_counter - 1
|
||||||
|
total_categories = category_counter - 1
|
||||||
|
log.info(f"Успешно добавлено {total_products} товаров и {total_categories} категорий в базу данных!")
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CParams(BaseModel):
|
||||||
|
id: int
|
||||||
|
name: str
|
||||||
|
val_id: str
|
||||||
@@ -5,4 +5,6 @@ from dataclasses import dataclass
|
|||||||
class Category(BaseModel):
|
class Category(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
name: str
|
name: str
|
||||||
atributes: list[list[str]]
|
prod_id: int
|
||||||
|
image_path: str
|
||||||
|
c_params_id: int
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Param(BaseModel):
|
||||||
|
id: int
|
||||||
|
name: str
|
||||||
|
val: str
|
||||||
@@ -5,7 +5,4 @@ from dataclasses import dataclass
|
|||||||
class Product(BaseModel):
|
class Product(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
name: str
|
name: str
|
||||||
category: int
|
|
||||||
desc: str
|
|
||||||
image_path: str
|
image_path: str
|
||||||
size: str
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Val(BaseModel):
|
||||||
|
id: int
|
||||||
|
val: str
|
||||||
Reference in new issue
Block a user