ШБР 2023 - Работа с БД из приложения и миграции (Python)

Поділитися
Вставка
  • Опубліковано 1 гру 2024

КОМЕНТАРІ • 8

  • @tatyanaderbysheva4317
    @tatyanaderbysheva4317 Рік тому +8

    Интересная лекция, очень приятный лектор. Эпическая презентация, около 150 слайдов. Слушается очень легко. Прилагаю тайминг первой половины.
    4:24 О чем будем говорить
    1. Как выбирать реляционную БД 5:04
    2. Клиент-серверный протокол Postgres 22:40
    3. Драйверы 51:05
    4. Работа с данными, курсором, транзакциями 1:10:30
    5. QueryBuilder 1:33:20
    6. ORM 1:51:47
    7. Миграции, тестирование 2:08:33
    8. Масштабирование и отказоустойчивость
    5:04 Критерии выбора СУБД
    Обзор СУБД:
    8:49 MySQL
    11:07 MariaDB
    13:40 Postgres (выбор сегодняшней лекции)
    15:55 SQLite
    18:41 Clickhouse
    22:40 - клиент-серверный протокол Postgres
    протокол простых запросов
    36:21 протокол расширенных запросов
    46:21 - вопрос про выбор протокола
    47:24 - вопросы слушателей
    50:40 ответ на впрос про выбор протокола
    51:05 Драйверы
    Синхронные:
    psycopg2
    psycopg(3)
    pg8000
    Асинхронные:
    aiopg
    psycopg(3)
    asyncpg
    56:33 psycopg2 - протокол простых запросов, экранирует DML и DDL на стороне клиента, используется по умолчанию в SQLAlchemy и Django(?).
    57:55 aiopg - обертка над pycopg2, протокол простых запросов, не поддерживает SQLAlchemy напрямую, но может использовать ее как QueryBuilder.
    59:45 psycopg(3) - оба протокола запросов Postgres, поддерживается SQLAlchemy и Django, удобный интерфейс для COPY, пулы соединений в psycopg_pool.
    1:01:06 asyncpg - быстрый, протокол расширенных запросов,
    1:03:05 pg8000 - написан на чистом питоне (медленный), совместим с PyPy и Jython, оба протокола запросов.
    1:05:00 контрольные вопросы
    1:10:30 Cursor
    1:20:00 Вопросы по курсорам, select+limit+offset существенно медленнее, чем добывать из курсора
    1:20:48 Транзакции
    1:26:50 save point
    1:27 вопросы про транзакции (вопросов нет)
    1:27:55 4.3 Работа с данными
    1:28:00 RETURNING - Позволяет получить данные из модифицируемых строк в процессе их обработки в запросах INSERT, UPDATE, DELETE
    1:29:00 UPSERT: insert или update - указывает действие, выполняемое в случае нарушения ограничения уникальности или ограничения-исключения
    1:31:48 SELECT FOR UPDATE - защищает выбранные строки от блокировки, изменения и удаления другими транзакциями до завершения текущей
    1:32 COPY FROM, COPY TO
    1:33:20 5. QUERY Builder (SQLAlchemy - о ней, Django - не рассматриваем)
    SQLAlchemy - гибкая, есть асинхронный ORM, из коробки
    1:38:37 Основные компоненты SQLAlchemy
    MetaData - контейнер, содержит информацию о схеме БД: таблицах, индексах, типах данных и тп.
    Table - содержит описание таблиц. Для того, чтобы алхимия могла генерировать запросы, ей требуется информация о таблицах (названия, типы столбцов и тп)
    1:41:47 MetaData, Table, запросы - код
    1:45:54 SQLAlchemy и асинхронный код
    - Core (QueryBuilder) можно использовать отдельно в качестве генератора запросов с асинхронными драйверами
    (aiopg для psycopg2 и asyncpgsa для asyncpg)
    - Можно использовать алхимию целиком (с драйверами asyncpg и psycopg). Тогда будет использоваться пул соедениений алхимии и вся ее объектная модель.
    - Внутри алхимии провязка реализована через greenlet (аналог coroutine)
    1:48:05 Вопросы по QueryBuilder
    1:51:47 6. ORM
    Приложение / Модели / QueryBuilder / Драйвер БД
    ORM - object relational mapping
    * Абстракция высокого уровня, позволяет работать с данными с использованием объектно-ориентированной парадигмы.
    * Позволяет размещать всю логику (методы, константы), связанную с сущностью, в ее классе.
    1:53:04 Declarative SQLAlchemy ORM
    * С помощью метакласса создает объект класса Table, связывает поля объекта со столбцами таблицы (Mapper), добавляет ссылку на объект MetaData.
    * Для синхронизации состояния объектов в базе данных и объектной модели используется специальный объект Session.
    1:55:56 как работать с таблицами ORM
    1:58:13 Вопросы по ORM (нет)

    • @vkg1
      @vkg1 6 місяців тому

      Легенда

  • @dima5116
    @dima5116 Рік тому +1

    Спасибо за лекцию, очень информативно и по полочкам. На подробное изучение с конспектом ушло порядка 8 часов

  • @hentan4912
    @hentan4912 Рік тому

    Интересная лекция и респект лектору, чувствуется, что человеку нравится питон))

  • @RozaNevroza
    @RozaNevroza Рік тому

    Пока это лучшая лекция, спасибо!

  • @palms1990
    @palms1990 Рік тому

    1:31:35 upsert работает только на поля, на которых есть ограничения уникальности. В 15 postgres наконец-то появилось команда merge, которая позволяет сделать upsert на основе набора фильтров по нескольким полям, если у них нет уникальности. Хотя и до merge это можно было бы сделать через cte

  • @tatyanaderbysheva4317
    @tatyanaderbysheva4317 Рік тому +6

    Продолжение тайминга лекции после перерыва
    1:58:35 ПЕРЕРЫВ
    2:08:33 7.1 Миграции
    * Атомарность - миграция (или группа миграций) должна быть применена полностью, или никак.
    * Обратимость - миграциия должна содержать код, который позволит вернуться к предыдущему состоянию.
    * Упорядоченность - должно быть понятно, в каком порядке нужно применять миграции, какую катить следующей.
    Alembic:
    * Построен поверх SQLAlchemy
    * Умеет генерировать код миграций, используя объект MetaData
    * Позволяет писать сложную бизнес-логику без каких-либо ограничений.
    * Режимы Alembic:
    * онлайн - можно выполнять запросы,
    * офлайн - генерирует SQL файл, который можно выполнить позже.
    2:11:27 Как начать использовать Alembic
    $alembic init alembic
    После выполнения будут созданы файлы:
    alembic/env.py
    alembic/script.py.mako - шаблон (jinja - ещё одна известная библиотека шаблонов, mako - другая)
    alembic/versions/
    alembic.ini
    2:21:00 Как и когда применять миграции?
    * Если приложение on-premises или доступ к нему ограничен, можно и нужно накатывать миграции автоматически, например, при запуске приложения.
    * Если у вас важный сервис, к которому есть доступ - накатывание миграций вручную дает больший контроль и позволяет оперативно реагировать на проблемы.
    2:23:29 Как быть с необратимыми изменениями?
    * Если вам больше не нужна таблица или столбец и вы хотите их удалить без возможности восстановить данные, не стоит их удалять сразу.
    При автоматическом накате миграций это правило должно строго выполняться. Потому что не откатиться назад.
    * Убрать все обращения к ресурсам в коде, как будто их не существует.
    * Столбцы/таблицы/типы данных можно пометить специальным декоратором, который будет сообщать о доступе к ресурсам, которые должны быть удалены. В алхимии есть.
    * Поставить задачу в бэклог на следующее удаление.
    2:25:25 Batch-операции.
    Это фишка Alembic и она нужна преимущественно для работы с SQLite.
    * SQLite поддерживает ограниченное подмножество Alter Table:
    переименовывание таблиц, добавление/переименовывание/удаление столбцов.
    * Alembic предоставляет batch-режим, который:
    * создает новую таблицу на основе описания миграции с временным именем,
    * копирует данные в новую таблицу из существующей,
    * существующая таблица удаляется,
    * новая таблица переименовывается в существующее имя таблицы.
    2:26:20 О чем стоит помнить
    * Менять данные на стороне python медленно. Лучше писать запросы, которые Alembic может выполнить на стороне postgres.
    * Если требуемые операции реализовать на стороне postgres невозможно, используйте пагинацию.
    * Добавление поля в Postgres без значения по умолчанию - очень быстро, С умолчанием - очень медленно. Добавление столбца без значения по умолчанию + добавление умолчания работает в итоге быстрее.
    * Создание индексов на таблицах в режиме CONCURRENTLY может помочь избежать блокировок (но может работать существенно дольше).
    2:28:55 Вопросы по миграциям (нет)
    2:29:30 7. Тестирование миграций
    2:32:46 Stairway тест: каждую миграцию применяет, откатывает, применяет, переходит к следующей.
    дальше кто-то другой пусть тайминги оставляет.
    Жаль, что не выкладывают презентацию.
    Огромное спасибо лектору за великолепную лекцию.

  • @valeriyemelyanov9090
    @valeriyemelyanov9090 Рік тому

    "MS SQL может составить конкуренцию MySQL" - однако