From 20a36a7d1cfbffb47d35665bd0154abf4fe223a9 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Mon, 5 Oct 2026 17:21:14 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D0=91=D0=94=20=E2=80=94=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20DB=5F*,=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - database.py, однофайловая копия для exe и импорт датасета читают DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD; прежние значения остались значениями по умолчанию; - импорт находит датасет в корне репозитория независимо от текущей папки (или берёт путь первым аргументом); - 20 неиспользуемых импортов и переопределений после склейки файлов (ruff). --- database.py | 10 ++++++++-- scripts/exe/mobile_devices.py | 20 +++++++++++--------- scripts/import_data.py | 21 +++++++++++++-------- 3 files changed, 32 insertions(+), 19 deletions(-) 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