Skip to content

Instantly share code, notes, and snippets.

@MikyPo
Created October 10, 2025 13:58
Show Gist options
  • Select an option

  • Save MikyPo/1f6187c9cc91bb9b8761076938d37122 to your computer and use it in GitHub Desktop.

Select an option

Save MikyPo/1f6187c9cc91bb9b8761076938d37122 to your computer and use it in GitHub Desktop.
conn_2_postgresql_railway_host
# 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