123 lines
5 KiB
Python
123 lines
5 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Скрипт для создания базы данных и загрузки начальных данных из Excel
|
|
Запуск: python init_db.py
|
|
"""
|
|
|
|
import os
|
|
import pandas as pd
|
|
from app import app, db
|
|
from app import Partner, ProductCategory, Product, Order, OrderItem
|
|
|
|
with app.app_context():
|
|
print("=" * 50)
|
|
print("ИНИЦИАЛИЗАЦИЯ БАЗЫ ДАННЫХ")
|
|
print("=" * 50)
|
|
|
|
# Создаём папку instance, если её нет
|
|
if not os.path.exists('instance'):
|
|
os.makedirs('instance')
|
|
print("✅ Папка instance создана")
|
|
|
|
# Создаём таблицы
|
|
print("\n1. Создание таблиц...")
|
|
db.create_all()
|
|
print(" ✅ Таблицы созданы")
|
|
|
|
# Проверяем, есть ли уже данные
|
|
if ProductCategory.query.count() > 0:
|
|
print("\n⚠️ Таблицы уже содержат данные!")
|
|
response = input("Удалить все данные и загрузить заново? (y/n): ")
|
|
if response.lower() != 'y':
|
|
print("❌ Операция отменена")
|
|
exit()
|
|
|
|
# Очищаем таблицы
|
|
print("\n2. Очистка существующих данных...")
|
|
OrderItem.query.delete()
|
|
Order.query.delete()
|
|
Product.query.delete()
|
|
Partner.query.delete()
|
|
ProductCategory.query.delete()
|
|
db.session.commit()
|
|
print(" ✅ Данные очищены")
|
|
|
|
# Загружаем категории
|
|
print("\n3. Загрузка категорий...")
|
|
try:
|
|
df = pd.read_excel('data/categories.xlsx')
|
|
for _, row in df.iterrows():
|
|
cat = ProductCategory(
|
|
id=int(row['id']),
|
|
name=row['name'],
|
|
description=row.get('description', '')
|
|
)
|
|
db.session.add(cat)
|
|
db.session.commit()
|
|
print(f" ✅ Добавлено {len(df)} категорий")
|
|
except Exception as e:
|
|
print(f" ❌ Ошибка: {e}")
|
|
|
|
# Загружаем партнёров
|
|
print("\n4. Загрузка партнёров...")
|
|
try:
|
|
df = pd.read_excel('data/partners.xlsx')
|
|
for _, row in df.iterrows():
|
|
partner = Partner(
|
|
id=int(row['id']),
|
|
name=row['name'],
|
|
short_name=row.get('short_name', ''),
|
|
partner_type=row.get('partner_type', ''),
|
|
director=row.get('director', ''),
|
|
phone=row.get('phone', ''),
|
|
discount=float(row.get('discount', 0)),
|
|
total_orders_sum=0, # Начальная сумма заказов
|
|
actual_address=row.get('actual_address', ''),
|
|
legal_address=row.get('legal_address', '')
|
|
)
|
|
db.session.add(partner)
|
|
db.session.commit()
|
|
print(f" ✅ Добавлено {len(df)} партнёров")
|
|
except Exception as e:
|
|
print(f" ❌ Ошибка: {e}")
|
|
|
|
# Загружаем товары
|
|
print("\n5. Загрузка товаров...")
|
|
try:
|
|
df = pd.read_excel('data/products.xlsx')
|
|
# Преобразуем числовые поля
|
|
df['alcohol_content'] = pd.to_numeric(df['alcohol_content'], errors='coerce')
|
|
df['volume'] = pd.to_numeric(df['volume'], errors='coerce')
|
|
|
|
for _, row in df.iterrows():
|
|
product = Product(
|
|
id=int(row['id']),
|
|
article=row['article'],
|
|
name=row['name'],
|
|
commercial_name=row.get('commercial_name', ''),
|
|
unit=row.get('unit', 'шт'),
|
|
base_price=float(row['base_price']),
|
|
excise_tax=float(row.get('excise_tax', 0)),
|
|
license_fee=float(row.get('license_fee', 0)),
|
|
is_alcohol=bool(int(row.get('is_alcohol', 0))),
|
|
alcohol_content=float(row['alcohol_content']) if pd.notna(row['alcohol_content']) else None,
|
|
volume=float(row['volume']) if pd.notna(row['volume']) else None,
|
|
category_id=int(row['category_id'])
|
|
)
|
|
db.session.add(product)
|
|
db.session.commit()
|
|
print(f" ✅ Добавлено {len(df)} товаров")
|
|
except Exception as e:
|
|
print(f" ❌ Ошибка: {e}")
|
|
|
|
# Показываем статистику
|
|
print("\n" + "=" * 50)
|
|
print("СТАТИСТИКА")
|
|
print("=" * 50)
|
|
print(f"Категорий: {ProductCategory.query.count()}")
|
|
print(f"Партнёров: {Partner.query.count()}")
|
|
print(f"Товаров: {Product.query.count()}")
|
|
print(f"Заявок: {Order.query.count()}")
|
|
|
|
print("\n✅ База данных успешно инициализирована!") |