- POST — создаёт новый ресурс. Повторный вызов — новый результат.
- PUT — полностью заменяет ресурс по указанному адресу.
- PATCH — частично изменяет ресурс, меняет только переданные поля.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊2👍1
Схема (schema) в базе данных — это логическая группировка объектов (таблиц, индексов, представлений и т. д.) внутри одной БД.
Схема — это контейнер для объектов БД (таблиц, индексов, процедур).
База данных (company_db)
├── Схема: public (по умолчанию)
│ ├── Таблица: employees
│ ├── Таблица: departments
├── Схема: hr
│ ├── Таблица: employees
│ ├── Таблица: salaries
├── Схема: sales
│ ├── Таблица: customers
│ ├── Таблица: orders
Создание схемы (
CREATE SCHEMA
) CREATE SCHEMA hr; -- Создаём схему "hr"
Создание таблицы внутри схемы
CREATE TABLE hr.employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50)
);
Выбор схемы по умолчанию
SET search_path TO hr;
Если в БД хранятся разные области бизнеса (кадры, продажи, финансы), их можно разделить по схемам:
-
hr.employees
, hr.salaries
-
sales.orders
, sales.customers
Например, в PostgreSQL можно создать схему
dev
для тестов: -
dev.users
— тестовая версия таблицы -
prod.users
— продакшен-версия Можно дать доступ к разным схемам разным пользователям:
GRANT USAGE ON SCHEMA hr TO hr_manager;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO hr_manager;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Индексы в PostgreSQL — это структуры данных (обычно B-tree), которые ускоряют выполнение запросов.
Бывают:
- B-tree — по умолчанию, для большинства операций;
- GIN — для полнотекстового поиска, массивов;
- GIST — для геоданных;
- BRIN — для больших, упорядоченных таблиц;
- Hash — редко используется, специфичный.
Они автоматически обновляются при изменении таблицы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💊1
Django использует
sqlparse
и asgiref
как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно. sqlparse
(SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM. Форматирование SQL-запросов в
django.db.connection.queries
from django.db import connection
from sqlparse import format
queries = connection.queries # Получаем список SQL-запросов
for q in queries:
print(format(q["sql"], reindent=True, keyword_case="upper")) # Красивый SQL
Логирование SQL-запросов
sqlparse
помогает Django красиво выводить SQL-запросы в DEBUG=True
.Команда
sqlmigrate
python manage.py sqlmigrate app_name 0001
asgiref
(Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref
— это её обязательная зависимость.Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с
asyncpg
).В
settings.py
есть параметр:ASGI_APPLICATION = "myproject.asgi.application"
Django 4.x поддерживает асинхронные middleware через
asgiref.sync
и asgiref.local
.Django использует
sync_to_async()
и async_to_sync()
из asgiref
:from asgiref.sync import sync_to_async
def sync_function():
return "Hello from sync!"
async_function = sync_to_async(sync_function)
print(async_function()) # Вызывает синхронную функцию в асинхронном коде
Позволяет хранить данные отдельно для каждого потока или запроса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Функция zip объединяет несколько итерируемых объектов в кортежи, идущие параллельно. Это удобно, когда нужно обрабатывать пары элементов — например, имена и их оценки, ключи и значения, столбцы из разных таблиц.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Monkey Patching — это изменение или замена кода существующих классов и функций во время выполнения программы. Хотя этот метод бывает полезен, особенно в тестировании, его использование в продакшене может привести к опасным и непредсказуемым последствиям
Когда ты изменяешь поведение встроенных библиотек или сторонних модулей на лету, программисты, читающие код, не смогут понять, почему стандартные функции ведут себя не так, как ожидалось.
import datetime
# Меняем поведение метода now()
def fake_now():
return datetime.datetime(2000, 1, 1)
datetime.datetime.now = fake_now # Monkey Patch
print(datetime.datetime.now()) # Выведет 2000-01-01 00:00:00
Если библиотека обновится, и её внутренняя логика изменится, Monkey Patch может перестать работать или, что ещё хуже, привести к багам.
Ты сделал Monkey Patch метода
json.dumps
, а потом библиотека json
обновилась и поменяла его сигнатуру. Теперь твой патч сломается или будет работать некорректно. Monkey Patching меняет поведение кода в скрытом режиме, поэтому сложно понять, почему что-то работает не так. Если баг возник из-за патча, отладка может занять часы или даже дни.
Ты исправил баг с
str.split()
, заменив его через Monkey Patch, но через 6 месяцев разработчик обновил код, забыл про патч, и всё сломалось.Monkey Patching меняет поведение для всей программы, а не только в одном модуле или файле. Это делает код хрупким и непредсказуемым.
Если ты изменишь метод
dict.get()
, он будет вести себя по-другому во всех модулях программы. Это может привести к критическим ошибкам. original_get = dict.get
def patched_get(self, key, default=None):
print(f"Запрашивается ключ: {key}")
return original_get(self, key, default)
dict.get = patched_get # Monkey Patch
d = {"a": 10}
print(d.get("a")) # Работает, но теперь с побочным эффектом
Monkey Patch может работать на одной версии Python или библиотеки, но сломаться на другой. В продакшене, где есть разные серверы и окружения, это может вызвать непредсказуемые ошибки.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это текстовый формат обмена данными:
- Представляет объекты и массивы в виде пар "ключ-значение".
- Легко читается человеком и машиной.
- Независим от языка, но тесно связан с синтаксисом JavaScript.
- Используется повсеместно для API и веб-приложений.
Примеры типов: строки, числа, булевы, массивы, объекты, null.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Словарь (
dict
) — это структура данных, которая хранит пары "ключ → значение". Через
{}
(фигурные скобки)my_dict = {"name": "Alice", "age": 25, "city": "New York"}
Изменение значения
my_dict["age"] = 26 # Меняем возраст
del
— удаление по ключуdel my_dict["city"]
Перебор ключей (
for key in dict
)for key in my_dict:
print(key, my_dict[key])
Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Нельзя использовать
list
как ключ! my_dict[[1, 2, 3]] = "Ошибка" # TypeError: unhashable type: 'list'
Можно использовать
tuple
, int
, str
, frozenset
my_dict[(1, 2, 3)] = "OK"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3💊3
В SQL можно объединять данные из двух таблиц без использования
JOIN
, используя альтернативные методы. Подзапрос (
subquery
) позволяет выбрать данные из одной таблицы, используя данные из другой. Допустим, у нас есть две таблицы:
employees (id, name, department_id)
departments (id, name)
SELECT name,
(SELECT name FROM departments WHERE id = employees.department_id) AS department_name
FROM employees;
Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments);
Если таблицы имеют схожие колонки, можно объединить их с
UNION
. SELECT id, name, email FROM users_old
UNION
SELECT id, name, email FROM users_new;
Хотя
CROSS JOIN
делает декартово произведение, его можно фильтровать WHERE
, имитируя INNER JOIN
. SELECT e.name, d.name AS department
FROM employees e, departments d
WHERE e.department_id = d.id;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Эта инструкция прерывает текущую итерацию цикла и переходит к следующей, не выходя из самого цикла.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
Когда необходимо контролировать доступ к ресурсу.
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
Для управления ресурсами, такими как память или сетевые соединения.
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
Контролирует доступ к объекту, создавая его по требованию.
Контролирует доступ к объекту, ограничивая права пользователей.
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
Кэширует результаты запросов к объекту для повышения производительности.
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Proxy
контролирует доступ к классу RealSubject
, добавляя проверку доступа и логирование.from abc import ABC, abstractmethod
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True
def log_access(self):
print("Заместитель: Логирование времени запроса.")
# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
- Через SQL-запросы напрямую (CLI, pgAdmin, MySQL Workbench);
- Через ORM (Django ORM, SQLAlchemy, Hibernate);
- Через Query Builder;
- Через API (REST, GraphQL, если БД скрыта за сервером);
- С использованием GUI-инструментов для админов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊3🔥1
🐍 Вебинар «Ящик со змеями: контейнеризация Python-приложений и работа с Docker»
📅 26 августа в 20:00 (МСК)
Хотите навести порядок в окружениях, ускорить разработку и перестать слышать «у меня работает, а у тебя - нет»? Тогда вам на этот вебинар от курса «Python Developer. Professional»!
Что будет на вебинаре?
- Зачем нужна контейнеризация и как она упрощает жизнь разработчику
- Особенности использования Docker для Python-приложений
- Как писать понятные и эффективные Dockerfile
- Как избежать типичных ошибок и работать с Docker в команде
🎓 Если вы хотите системно развиваться в Python и выйти на профессиональный уровень - не упустите шанс! Курс стартует уже 29 сентября, и вебинар - отличный повод начать этот путь.
📲 Участие бесплатно. Регистрируйтесь и приходите: https://otus.pw/ZFfI/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📅 26 августа в 20:00 (МСК)
Хотите навести порядок в окружениях, ускорить разработку и перестать слышать «у меня работает, а у тебя - нет»? Тогда вам на этот вебинар от курса «Python Developer. Professional»!
Что будет на вебинаре?
- Зачем нужна контейнеризация и как она упрощает жизнь разработчику
- Особенности использования Docker для Python-приложений
- Как писать понятные и эффективные Dockerfile
- Как избежать типичных ошибок и работать с Docker в команде
🎓 Если вы хотите системно развиваться в Python и выйти на профессиональный уровень - не упустите шанс! Курс стартует уже 29 сентября, и вебинар - отличный повод начать этот путь.
📲 Участие бесплатно. Регистрируйтесь и приходите: https://otus.pw/ZFfI/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия
проверяет URL и параметры в строке запроса (например,
?id=123
). находит запрашиваемый файл, данные из базы или другой ресурс.
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).
не изменяет данные на сервере, используется только для чтения.
повторные запросы дают одинаковый результат.
данные передаются через строку запроса, что не подходит для конфиденциальной информации.
import requests
response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Списки (list) применяются, когда нужен изменяемый порядок элементов. Кортежи (tuple) подходят для фиксированных наборов данных, а множества (set) — для уникальных, неупорядоченных элементов с быстрым поиском.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊2
В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:
Операторы (
+
, -
, *
, and
, or
, not
и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.a = 10 + 5 # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора
Встроенные ключевые слова Python (
if
, else
, while
, for
, def
, class
, return
и т. д.) не являются объектами. Они зарезервированы интерпретатором и используются для управления потоком выполнения кода.print(type(if)) # Ошибка: ключевое слово не является объектом
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
x = 42 # x — это имя, а не объект
print(type(x)) # Это целое число, но само имя "x" объектом не является
Аннотации типов в Python, такие как
list[str]
, не создают объекты во время компиляции кода. Они интерпретируются только на уровне анализа типов.def func(x: int) -> str:
return str(x)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
28 августа(в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM