Интересная лекция, очень приятный лектор. Эпическая презентация, около 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 (нет)
1:31:35 upsert работает только на поля, на которых есть ограничения уникальности. В 15 postgres наконец-то появилось команда merge, которая позволяет сделать upsert на основе набора фильтров по нескольким полям, если у них нет уникальности. Хотя и до merge это можно было бы сделать через cte
Продолжение тайминга лекции после перерыва 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 тест: каждую миграцию применяет, откатывает, применяет, переходит к следующей. дальше кто-то другой пусть тайминги оставляет. Жаль, что не выкладывают презентацию. Огромное спасибо лектору за великолепную лекцию.
Интересная лекция, очень приятный лектор. Эпическая презентация, около 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 (нет)
Легенда
Спасибо за лекцию, очень информативно и по полочкам. На подробное изучение с конспектом ушло порядка 8 часов
Интересная лекция и респект лектору, чувствуется, что человеку нравится питон))
Пока это лучшая лекция, спасибо!
1:31:35 upsert работает только на поля, на которых есть ограничения уникальности. В 15 postgres наконец-то появилось команда merge, которая позволяет сделать upsert на основе набора фильтров по нескольким полям, если у них нет уникальности. Хотя и до merge это можно было бы сделать через cte
Продолжение тайминга лекции после перерыва
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 тест: каждую миграцию применяет, откатывает, применяет, переходит к следующей.
дальше кто-то другой пусть тайминги оставляет.
Жаль, что не выкладывают презентацию.
Огромное спасибо лектору за великолепную лекцию.
"MS SQL может составить конкуренцию MySQL" - однако