master-floor/ressult/database_init.py
2025-11-26 19:31:33 +03:00

196 lines
8.1 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# database_init.py
"""
Скрипт инициализации базы данных с исправлением ошибки типа данных
"""
import argparse
import sys
import os
from app.database import db
import bcrypt
def parse_arguments():
"""Парсинг аргументов командной строки"""
parser = argparse.ArgumentParser(description='Инициализация базы данных MasterPol')
parser.add_argument('--host', default='localhost', help='Хост PostgreSQL')
parser.add_argument('--port', default='5432', help='Порт PostgreSQL')
parser.add_argument('--database', default='masterpol', help='Имя базы данных')
parser.add_argument('--username', default='postgres', help='Имя пользователя PostgreSQL')
parser.add_argument('--password', required=True, help='Пароль пользователя PostgreSQL')
return parser.parse_args()
def initialize_database(db_url):
"""Инициализация структуры базы данных с тестовыми данными"""
# Устанавливаем URL базы данных
os.environ['DATABASE_URL'] = db_url
# Удаляем существующие таблицы (для чистой инициализации)
drop_tables = """
DROP TABLE IF EXISTS sales CASCADE;
DROP TABLE IF EXISTS partners CASCADE;
DROP TABLE IF EXISTS managers CASCADE;
"""
# Создание таблицы партнеров с правильным типом для rating
partners_table = """
CREATE TABLE IF NOT EXISTS partners (
partner_id SERIAL PRIMARY KEY,
partner_type VARCHAR(50),
company_name VARCHAR(255) NOT NULL,
legal_address TEXT,
inn VARCHAR(20) UNIQUE NOT NULL,
director_name VARCHAR(255),
phone VARCHAR(50),
email VARCHAR(255),
rating INTEGER NOT NULL DEFAULT 0 CHECK (rating >= 0 AND rating <= 100),
sales_locations TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
# Создание таблицы продаж
sales_table = """
CREATE TABLE IF NOT EXISTS sales (
sale_id SERIAL PRIMARY KEY,
partner_id INTEGER NOT NULL REFERENCES partners(partner_id) ON DELETE CASCADE,
product_name VARCHAR(255) NOT NULL,
quantity DECIMAL(15,2) NOT NULL,
sale_date DATE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
# Создание таблицы менеджеров
managers_table = """
CREATE TABLE IF NOT EXISTS managers (
manager_id SERIAL PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(255) NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
try:
# Удаляем существующие таблицы
try:
db.execute_query(drop_tables)
print("✅ Существующие таблицы удалены")
except Exception as e:
print(f" Таблицы для удаления не найдены: {e}")
# Создание таблиц
db.execute_query(partners_table)
db.execute_query(sales_table)
db.execute_query(managers_table)
print("✅ База данных успешно инициализирована")
# Создание тестового менеджера
password = "pass123"
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
db.execute_query("""
INSERT INTO managers (username, password_hash, full_name)
VALUES ('manager', %s, 'Тестовый Менеджер')
ON CONFLICT (username) DO NOTHING
""", (hashed_password,))
print("✅ Тестовый пользователь создан (manager/pass123)")
# Добавление тестовых партнеров
test_partners = [
{
'partner_type': 'distributor',
'company_name': 'ООО "Ромашка"',
'legal_address': 'г. Москва, ул. Ленина, д. 1',
'inn': '1234567890',
'director_name': 'Иванов Иван Иванович',
'phone': '+79991234567',
'email': 'info@romashka.ru',
'rating': 85, # INTEGER значение от 0 до 100
'sales_locations': 'Москва, Санкт-Петербург'
},
{
'partner_type': 'retail',
'company_name': 'ИП Петров',
'legal_address': 'г. Санкт-Петербург, Невский пр., д. 100',
'inn': '0987654321',
'director_name': 'Петров Петр Петрович',
'phone': '+79998765432',
'email': 'petrov@mail.ru',
'rating': 72, # INTEGER значение от 0 до 100
'sales_locations': 'Санкт-Петербург'
}
]
for partner in test_partners:
db.execute_query("""
INSERT INTO partners
(partner_type, company_name, legal_address, inn, director_name,
phone, email, rating, sales_locations)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
""", (
partner['partner_type'], partner['company_name'],
partner['legal_address'], partner['inn'],
partner['director_name'], partner['phone'],
partner['email'], partner['rating'],
partner['sales_locations']
))
print("✅ Тестовые партнеры добавлены")
# Добавление тестовых продаж
test_sales = [
(1, 'Продукт А', 150.50, '2024-01-15'),
(1, 'Продукт Б', 75.25, '2024-01-16'),
(2, 'Продукт В', 200.00, '2024-01-17'),
(1, 'Продукт А', 100.00, '2024-01-18')
]
for sale in test_sales:
db.execute_query("""
INSERT INTO sales (partner_id, product_name, quantity, sale_date)
VALUES (%s, %s, %s, %s)
""", sale)
print("✅ Тестовые продажи добавлены")
# Проверяем, что данные корректно добавлены
partners_count = db.execute_query("SELECT COUNT(*) as count FROM partners")[0]['count']
sales_count = db.execute_query("SELECT COUNT(*) as count FROM sales")[0]['count']
managers_count = db.execute_query("SELECT COUNT(*) as count FROM managers")[0]['count']
print(f"📊 Статистика базы данных:")
print(f" - Партнеров: {partners_count}")
print(f" - Продаж: {sales_count}")
print(f" - Менеджеров: {managers_count}")
return True
except Exception as e:
print(f"❌ Ошибка инициализации базы данных: {e}")
import traceback
traceback.print_exc()
return False
def main():
"""Основная функция"""
args = parse_arguments()
# Формируем URL подключения
db_url = f"postgresql://{args.username}:{args.password}@{args.host}:{args.port}/{args.database}"
print(f"🔄 Подключение к базе данных: {args.database} на {args.host}:{args.port}")
success = initialize_database(db_url)
if success:
print("🎉 Инициализация базы данных завершена успешно!")
sys.exit(0)
else:
print("💥 Инициализация базы данных завершена с ошибками!")
sys.exit(1)
if __name__ == "__main__":
main()