Created
October 10, 2025 13:58
-
-
Save MikyPo/1f6187c9cc91bb9b8761076938d37122 to your computer and use it in GitHub Desktop.
conn_2_postgresql_railway_host
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Developed by MikyPo | |
| # More code for DA here: https://dzen.ru/mikypo | |
| """ | |
| Подключение к БД PostgreSQL на Railway hosting | |
| """ | |
| !pip install psycopg2-binary --quiet # Ставим psycopg, если ещё не установлено | |
| # 1. Ставим нужные библиотеки | |
| import os | |
| import psycopg2 | |
| import pandas as pd | |
| from sqlalchemy import create_engine, text | |
| from dotenv import load_dotenv | |
| # Переменные окружения | |
| load_dotenv() # по умолчанию .env в текущей директории | |
| # Извлекаем переменные | |
| DB_HOST = os.getenv('DB_HOST') | |
| DB_PORT = os.getenv('DB_PORT') | |
| DB_NAME = os.getenv('DB_NAME') | |
| DB_USER = os.getenv('DB_USER') | |
| DB_PASSWORD = os.getenv('DB_PASSWORD') | |
| # 2. Проверка подключения к БД | |
| try: | |
| conn = psycopg2.connect( | |
| host=DB_HOST, | |
| port=DB_PORT, | |
| dbname=DB_NAME, | |
| user=DB_USER, | |
| password=DB_PASSWORD | |
| ) | |
| print("?? Успешно подключились к PostgreSQL!") | |
| # Простой тестовый запрос | |
| cur = conn.cursor() | |
| cur.execute("SELECT version();") | |
| version = cur.fetchone() | |
| print(f"?? Версия PostgreSQL: {version[0]}") | |
| cur.close() # Закрываем соединение | |
| conn.close() | |
| except Exception as e: | |
| print(f"? Ошибка: {e}") | |
| # 3. Функция запроса к БД | |
| # Создаем engine один раз | |
| connection_string = f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" | |
| engine = create_engine(connection_string) | |
| def execute_sql(query): | |
| """ | |
| Выполняет SQL запрос и возвращает результат в виде DataFrame | |
| Поддерживает CREATE, INSERT, SELECT, UPDATE, DELETE и другие команды | |
| """ | |
| try: | |
| # Определяем тип запроса | |
| query_type = query.strip().split()[0].upper() | |
| # Для SELECT запросов возвращаем DataFrame | |
| if query_type == 'SELECT': | |
| df = pd.read_sql(query, engine) | |
| print(f"? SELECT выполнен. Возвращено {len(df)} строк") | |
| return df | |
| # Для других запросов используем connection | |
| else: | |
| with engine.connect() as conn: | |
| # Выполняем запрос | |
| result = conn.execute(text(query)) | |
| conn.commit() | |
| # Для INSERT/UPDATE/DELETE возвращаем количество affected rows | |
| if query_type in ['INSERT', 'UPDATE', 'DELETE']: | |
| print(f"? {query_type} выполнен. Затронуто {result.rowcount} строк") | |
| return pd.DataFrame({'affected_rows': [result.rowcount]}) | |
| # Для CREATE, DROP, ALTER и других DDL команд | |
| else: | |
| print(f"? {query_type} выполнен успешно") | |
| return pd.DataFrame({'status': [f'{query_type} completed successfully']}) | |
| except Exception as e: | |
| error_msg = f"? Ошибка при выполнении запроса: {e}" | |
| print(error_msg) | |
| return pd.DataFrame({'error': [error_msg]}) | |
| # 4.1 Функция просмотра всех таблиц в БД | |
| def show_tables(): | |
| """Показывает все таблицы в текущей базе данных""" | |
| query = """ | |
| SELECT | |
| table_name, | |
| table_type | |
| FROM information_schema.tables | |
| WHERE table_schema = 'public' | |
| ORDER BY table_name; | |
| """ | |
| return execute_sql(query) | |
| # Запускаем | |
| print("?? Список таблиц в базе данных:") | |
| tables_df = show_tables() | |
| display(tables_df) | |
| // Out: | |
| ?? Список таблиц в базе данных: | |
| ? SELECT выполнен. Возвращено 0 строк | |
| table_name table_type | |
| # 4.2 Функция просмотра всех таблиц БД вместе с колонками и значениями | |
| def show_tables_with_columns(): | |
| """Показывает все таблицы и их колонки с типами данных""" | |
| query = """ | |
| SELECT | |
| t.table_name, | |
| c.column_name, | |
| c.data_type, | |
| c.is_nullable, | |
| c.column_default, | |
| c.character_maximum_length | |
| FROM information_schema.tables t | |
| JOIN information_schema.columns c | |
| ON t.table_name = c.table_name | |
| AND t.table_schema = c.table_schema | |
| WHERE t.table_schema = 'public' | |
| ORDER BY t.table_name, c.ordinal_position;""" | |
| return execute_sql(query) | |
| # Запускаем | |
| print("?? Таблицы и их колонки:") | |
| tables_columns_df = show_tables_with_columns() | |
| display(tables_columns_df) | |
| # 5. Запрос удаления таблицы "books" и создания таблицы "books" в БД | |
| # Удаляем таблицу | |
| drop_result = execute_sql("DROP TABLE IF EXISTS books;") | |
| display(drop_result) | |
| # Создаем таблицу заново | |
| create_result = execute_sql(""" | |
| CREATE TABLE books ( | |
| id_book SERIAL PRIMARY KEY, | |
| title VARCHAR(100) NOT NULL, | |
| author VARCHAR(100) NOT NULL, | |
| published_date DATE, | |
| available BOOLEAN DEFAULT TRUE, | |
| genre VARCHAR(50));""") | |
| display(create_result) | |
| # 6. Запрос на добавление книг в таблицу "books" | |
| # Добавляем книги | |
| insert_query = """ | |
| INSERT INTO books (title, author, published_date, available, genre) VALUES | |
| ('Преступление и наказание', 'Фёдор Достоевский', '1866-01-01', TRUE, 'Роман'), | |
| ('Идиот', 'Фёдор Достоевский', '1869-01-01', FALSE, 'Роман'), | |
| ('Война и мир', 'Лев Толстой', '1869-01-01', TRUE, 'Роман-эпопея'), | |
| ('Анна Каренина', 'Лев Толстой', '1877-01-01', FALSE, 'Роман'), | |
| ('Мастер и Маргарита', 'Михаил Булгаков', '1967-01-01', TRUE, 'Фантастика');""" | |
| result = execute_sql(insert_query) | |
| display(result) | |
| # 7. Вывод таблицы books | |
| # Запрашиваем все данные из таблицы | |
| select_query = "SELECT * FROM books;" | |
| books_df = execute_sql(select_query) | |
| display(books_df) | |
| # 8. Запрос удаления таблицы "artifacts" и создания таблицы "artifacts" в БД | |
| # Удаляем таблицу | |
| drop_result = execute_sql("DROP TABLE IF EXISTS artifacts;") | |
| display(drop_result) | |
| # Создаем таблицу заново | |
| create_result = execute_sql(""" | |
| CREATE TABLE artifacts ( | |
| id_artifact SERIAL PRIMARY KEY, | |
| name VARCHAR(100) NOT NULL, | |
| material VARCHAR(100) NOT NULL, | |
| damage INTEGER, | |
| fix INTEGER, | |
| is_composite BOOLEAN, | |
| is_relict BOOLEAN);""") | |
| display(create_result) | |
| # 9. Запрос на добавение артифактов в таблицу "artifacts" | |
| # После создания таблицы можно добавить данные: | |
| insert_data = """ | |
| INSERT INTO artifacts (name, material, damage, fix, is_composite, is_relict) VALUES | |
| ('Меч тысячи истин', 'Мифрил', 150, NULL, FALSE, TRUE), | |
| ('Щит непоколебимости', 'Обсидиан', NULL, 200, FALSE, FALSE), | |
| ('Посох четырёх стихий', 'Древо жизни', 80, 60, TRUE, TRUE), | |
| ('Кольцо возрождения', 'Золото', NULL, 100, FALSE, FALSE), | |
| ('Арбалет снайпера', 'Сталь', 120, NULL, TRUE, FALSE); | |
| """ | |
| execute_sql(insert_data) | |
| # 10. Вывод таблицы artifacts | |
| # Запрашиваем все данные из таблицы | |
| select_query = "SELECT * FROM artifacts;" | |
| books_df = execute_sql(select_query) | |
| display(books_df) | |
| # 11. Посмотрим все таблицы БД | |
| print("?? Таблицы и их колонки:") | |
| tables_columns_df = show_tables_with_columns() | |
| display(tables_columns_df) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment