Нашёл халявный хостинг для тренировки по SQL: railway.com Можно создать тестовую БД на 24 часа как в ныне почившем ElephantSQL.
Всё интуитивно понятно. После создания БД, например PostgreSQL, можно получить доступы для подключения: в строке:
🔌 postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}
Все эти переменные прописываем в файл .env, который будет лежать вместе с нашим скриптом. В самом .env переменные хранятся в виде:
DB_HOST=hopper.proxy.rlwy.net
DB_PORT=11948
DB_NAME=railway
DB_USER=postgres
DB_PASSWORD=ваш_пароль
Эти доступы можно использовать для подключения в Python-коде. Открываем Jupyter notebook, пишем:
!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)
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)
После добавления таблиц в БД через код python, они появятся на хостинге.