diff --git a/database.py b/database.py index d85582e..405b49a 100644 --- a/database.py +++ b/database.py @@ -1,4 +1,5 @@ # db/database.py +import os import psycopg2 from psycopg2.extras import RealDictCursor from typing import List, Dict, Any, Optional @@ -20,8 +21,13 @@ class Database: cls._instance = super().__new__(cls) return cls._instance - def __init__(self, host='localhost', port=5432, database='mobile_devices_db', - user='admin', password='password'): + def __init__(self, host=None, port=None, database=None, user=None, password=None): + # Параметры подключения: аргументы, затем переменные окружения DB_*, затем значения для локальной разработки + host = host or os.environ.get('DB_HOST', 'localhost') + port = port or int(os.environ.get('DB_PORT', '5432')) + database = database or os.environ.get('DB_NAME', 'mobile_devices_db') + user = user or os.environ.get('DB_USER', 'admin') + password = password or os.environ.get('DB_PASSWORD', 'password') if not hasattr(self, 'initialized'): self.connection_params = { 'host': host, diff --git a/scripts/exe/mobile_devices.py b/scripts/exe/mobile_devices.py index 3c68e98..8a44e4b 100644 --- a/scripts/exe/mobile_devices.py +++ b/scripts/exe/mobile_devices.py @@ -5,24 +5,21 @@ from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import Qt # ui/main_window.py -import sys from PyQt6.QtWidgets import ( - QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, + QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, QPushButton, QTabWidget, QLabel, QLineEdit, QComboBox, QSpinBox, QMessageBox, QDialog, QFormLayout, QDialogButtonBox, QHeaderView, QToolBar, QStatusBar, QGroupBox, QTextEdit, QInputDialog ) -from PyQt6.QtCore import Qt, QTimer, pyqtSignal -from PyQt6.QtGui import QAction, QIcon, QFont +from PyQt6.QtGui import QAction, QFont from typing import Optional, Dict, Any -import logging # db/database.py +import os import psycopg2 from psycopg2.extras import RealDictCursor -from typing import List, Dict, Any, Optional -import logging +from typing import List from contextlib import contextmanager logger = logging.getLogger(__name__) @@ -48,8 +45,13 @@ class Database: cls._instance = super().__new__(cls) return cls._instance - def __init__(self, host='localhost', port=5432, database='mobile_devices_db', - user='admin', password='password'): + def __init__(self, host=None, port=None, database=None, user=None, password=None): + # Параметры подключения: аргументы, затем переменные окружения DB_*, затем значения для локальной разработки + host = host or os.environ.get('DB_HOST', 'localhost') + port = port or int(os.environ.get('DB_PORT', '5432')) + database = database or os.environ.get('DB_NAME', 'mobile_devices_db') + user = user or os.environ.get('DB_USER', 'admin') + password = password or os.environ.get('DB_PASSWORD', 'password') if not hasattr(self, 'initialized'): self.connection_params = { 'host': host, diff --git a/scripts/import_data.py b/scripts/import_data.py index f004aca..b540f40 100644 --- a/scripts/import_data.py +++ b/scripts/import_data.py @@ -1,8 +1,9 @@ +import os +import sys import pandas as pd import psycopg2 -from psycopg2.extras import execute_values import re -from typing import Optional, Dict, Tuple +from typing import Optional, Dict import logging # Настройка логирования @@ -245,12 +246,13 @@ class MobileDataImporter: # Использование скрипта if __name__ == "__main__": # Конфигурация подключения к БД + # Параметры подключения — из переменных окружения DB_* (по умолчанию — локальная разработка) db_config = { - 'host': 'localhost', - 'port': 5432, - 'database': 'mobile_devices_db', - 'user': 'admin', - 'password': 'password' # Замените на ваш пароль + 'host': os.environ.get('DB_HOST', 'localhost'), + 'port': int(os.environ.get('DB_PORT', '5432')), + 'database': os.environ.get('DB_NAME', 'mobile_devices_db'), + 'user': os.environ.get('DB_USER', 'admin'), + 'password': os.environ.get('DB_PASSWORD', 'password'), } # Создаем импортер и выполняем импорт @@ -258,6 +260,9 @@ if __name__ == "__main__": try: importer.connect() - importer.import_data('Mobiles Dataset 2025.csv') # Укажите путь к вашему файлу + # Датасет лежит в корне репозитория; другой файл можно передать первым аргументом + csv_path = sys.argv[1] if len(sys.argv) > 1 else os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'Mobiles Dataset 2025.csv') + importer.import_data(csv_path) finally: importer.disconnect() \ No newline at end of file