Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7f6c061
init
MichaelGorbunov Aug 26, 2024
cdda76f
добавлены библиотеки psycopg2 requests python
MichaelGorbunov Aug 26, 2024
4b128da
создание базы
MichaelGorbunov Aug 27, 2024
03a4341
g
MichaelGorbunov Aug 27, 2024
a37de50
g
MichaelGorbunov Aug 27, 2024
98bed02
q
MichaelGorbunov Aug 28, 2024
b32e677
наброски api, db utils
MichaelGorbunov Aug 28, 2024
b83d27e
й
MichaelGorbunov Aug 28, 2024
5f94558
g
MichaelGorbunov Aug 28, 2024
791f2ca
Merge remote-tracking branch 'origin/develop' into develop
MichaelGorbunov Aug 29, 2024
1a08a31
подготовлены данные для вставки в базу
MichaelGorbunov Aug 29, 2024
394c92a
функция вставки заказчиков в базу
MichaelGorbunov Aug 29, 2024
b47992a
функция вставки вакансий в базу
MichaelGorbunov Aug 29, 2024
f85359a
добавлен абстрактный db_manager
MichaelGorbunov Aug 29, 2024
856a37d
get_vacancies_with_keyword
MichaelGorbunov Aug 29, 2024
b7fd06f
get_avg_salary
MichaelGorbunov Aug 29, 2024
49521b9
get_companies_and_vacancies_count()
MichaelGorbunov Aug 29, 2024
4e2d132
get_vacancies_with_higher_salary()
MichaelGorbunov Aug 29, 2024
8a46fef
alternate_url
MichaelGorbunov Aug 29, 2024
fe59919
sep **
MichaelGorbunov Aug 29, 2024
1fe175f
per_page
MichaelGorbunov Aug 29, 2024
4d0b1a0
lint
MichaelGorbunov Aug 29, 2024
288552c
main
MichaelGorbunov Aug 29, 2024
519dfa7
описание
MichaelGorbunov Aug 29, 2024
5ae04f6
readme.md
MichaelGorbunov Aug 29, 2024
03e7460
emp_id
MichaelGorbunov Aug 29, 2024
652420a
fix
MichaelGorbunov Aug 29, 2024
daff98b
Update readme.md
MichaelGorbunov Aug 30, 2024
fa57b84
мелкие ошибки
MichaelGorbunov Aug 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env_sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
POSTGRES_HOST=localhost
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_PORT=5432
POSTGRES_DB=hh_database
EMP_ID_LIST="6041,2227671,2748,3776,3529,78638,4233,5390761,2180,906557"
127 changes: 127 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import os

import psycopg2
from dotenv import load_dotenv
from src.db_util import create_db,create_tables
from src.api_hh import insert_vac_data,insert_emp_data
from src.db_manager import DBManager

load_dotenv()

db_config = {
"user": os.getenv("POSTGRES_USER"),
"password": os.getenv("POSTGRES_PASSWORD"),
"host": os.getenv("POSTGRES_HOST"),
"port": os.getenv("POSTGRES_PORT"),
"dbname": os.getenv("POSTGRES_DB")
}


def check_db() -> bool:
"""функция проверяет наличие базы данных """
with psycopg2.connect(
database="postgres",
user=os.getenv("POSTGRES_USER"),
password=os.getenv("POSTGRES_PASSWORD"),
host=os.getenv("POSTGRES_HOST"),
port=os.getenv("POSTGRES_PORT"),
) as conn:
cur = conn.cursor()
cur.execute(
"SELECT count(datname) FROM pg_database WHERE datname = (%s) ",
(db_config["dbname"],),
)
rows = cur.fetchall()
cur.close()


if rows[0][0] != 1:
return False
else:
return True
conn.close()





def main():
db_create: bool
db_create = check_db()
if db_create is False:
print(f"База {os.getenv("POSTGRES_DB")} не существует")
create_db()
print(f"База {os.getenv("POSTGRES_DB")} создана")
create_tables()
print(" таблицы созданы")
print()
else:
print(f"База {os.getenv("POSTGRES_DB")} существует")
create_tables()


list_empl_str=os.getenv("EMP_ID_LIST").split(',')
for item in list_empl_str:
insert_emp_data(int(item))#вставка данных о работодателях
insert_vac_data(item, 100)#вставка данных о вакансиях

print("Данные из api.hh.ru загружены ")
db_manager=DBManager()

print("Вывод списка работодателей и количества вакансий в базе ")
m = input("Нажмите Enter для продолжения")
result = db_manager.get_companies_and_vacancies_count()
for item in result:
print(*item, sep=" ** ")

print("Все вакансии:")
m = input("Нажмите Enter для продолжения")
result = db_manager.get_all_vacancies() #все вакансии
for item in result:
print(*item, sep=" ** ")

print("Вычисление средней зарплаты:")
m = input("Нажмите Enter для продолжения")
result = db_manager.get_avg_salary()#Средняя зарплата
print(f"Средняя зарплата: {result}")

print("Список вакансий c зарплатой выше средней:")
m = input("Нажмите Enter для продолжения")
result = db_manager.get_vacancies_with_higher_salary()
for item in result:
print(*item, sep=" ** ")

print("Поиск вакансий по ключевому слову")
keyword=input("Введите ключевое слово : ")
result = db_manager.get_vacancies_with_keyword(keyword)

for item in result:
print(*item, sep=" ** ")















if __name__ == "__main__":
main()

# print(db_config1)
# list_empl:list[int] = []
# env_list = os.getenv("EMP_ID_LIST")
# list_empl_str=env_list.split(',')
# for item in list_empl_str:
# list_empl.append(int(item))
#
# print(list_empl)
# db_config1['dbname'] = "postgres"
# print(db_config1)
30 changes: 30 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[tool.poetry]
name = "cw-5-database"
version = "0.1.0"
description = ""
authors = ["Michael Gorbunov"]
license = "free"
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"
psycopg2 = "^2.9.9"
requests = "^2.32.3"
python-dotenv = "^1.0.1"
types-psycopg2 = "^2.9.21.20240819"
types-requests = "^2.32.0.20240712"


[tool.poetry.group.lint.dependencies]
flake8 = "^7.1.1"
black = "^24.8.0"
isort = "^5.13.2"
mypy = "^1.11.2"


[tool.poetry.group.dev.dependencies]
pytest-cov = "^5.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
63 changes: 63 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Проект: Работа с БД PostgreSQL и API hh.ru
## Описание
Данный проект предназначен для сбора и анализа данных о работодателях и вакансиях
с использованием API hh.ru (HeadHunter). Он позволяет пользователю получать
информацию о компаниях и их вакансиях, сохранять эту информацию в базе данных
PostgreSQL и выполнять различные запросы для анализа данных.

Проект состоит из нескольких модулей, которые взаимодействуют друг с другом:
1. main.py: Основной файл для запуска проекта. Инициализирует сбор данных и выполняет запросы к базе данных.
2. db_util.py: Модуль для создания базы данных и таблиц.
3. db_manager.py: Класс для взаимодействия с базой данных и выполнения запросов.
4. api_hh.py: Модуль для взаимодействия с API hh.ru и вставки данных в базу.
5. .env_sample: Конфигурация подключения к базе данных.


## Установка
- Клонируйте репозиторий на свой компьютер:

```
https://github.com/MichaelGorbunov/CW_5_DataBase
```

- Установите необходимые зависимости:
1. Создайте и активируйте виртуальное окружение poetry (рекомендуется)
2. Установите зависимости из pyproject.toml
3. Настройте подключение к базе данных в файле .env_sample и переименуйте его в .env.
Для корректного первичного подключения необходимо наличие базы postgres на сервере.
4. В файл записан список id работодателей
```
POSTGRES_HOST=localhost
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_PORT=5432
POSTGRES_DB=hh_database
EMP_ID_LIST="6041,2227671,2748,3776,3529,78638,4233,5390761,2180,906557"
```

## Использование
Для запуска приложения используйте команду:

python main.py

## Результат:
Скрипт выполнит следующие шаги:

1. Создаст базу данных и таблицы для хранения данных о компаниях и вакансиях.
2. Соберет данные о 10 работодателях и их вакансиях(первые 100) с помощью API hh.ru.
3. Сохранит собранные данные в базу данных.
4. Выполнит несколько запросов к базе данных и выведет результаты.

## Структура проекта
```
main.py # Основной скрипт для запуска проекта
db_util.py # Модуль для создания БД и таблиц
db_manager.py # Модуль для выполнения запросов к базе данных
api_hh.py # Модуль для взаимодействия с API hh.ru и заполнения БД
.env_sample # Файл примера для конфигурации подключения к базе данных
README.md # Описание проекта
```

## Лицензия
Проект предназначен для изучения Python,SQL,PostgreSQL и может использоваться для любых целей,
не противоречащих законодательству РФ.
Loading