py.lib.aw_db_tools
2024-02-27
Parent:4b0d10bfa023
py.lib.aw_db_tools/docs/db-migrator.md
.
| awgur@0 | 1 # db_migrator |
| awgur@0 | 2 |
| awgur@0 | 3 ## Окружение |
| awgur@0 | 4 |
| awgur@0 | 5 Для обеспечения миграции должен быть развёрнут каталог с данными миграции и в БД присутствовать отношение, хранящее версию текущей схемы. |
| awgur@0 | 6 |
| awgur@0 | 7 Для организации миграции необходимо создать и поддерживать директорию определённой структуры: |
| awgur@0 | 8 |
| awgur@0 | 9 ```yaml |
| awgur@0 | 10 - schema.sql: Файл с начальной схемой данных |
| awgur@0 | 11 patch: # Каталог с изменениями |
| awgur@0 | 12 - 0.sql |
| awgur@0 | 13 - 1.sql |
| awgur@0 | 14 # ... |
| awgur@0 | 15 ``` |
| awgur@0 | 16 |
| awgur@0 | 17 Схема таблицы с версией: |
| awgur@0 | 18 |
| awgur@0 | 19 ```sql |
| awgur@0 | 20 CREATE TABLE app_version_info ( |
| awgur@0 | 21 version integer default -1 |
| awgur@0 | 22 ); |
| awgur@0 | 23 ``` |
| awgur@0 | 24 |
| awgur@0 | 25 Имя таблицы значения не имеет, так как задаётся при вызове класса миграции. Однако **схема должна** соответствовать. |
| awgur@0 | 26 |
| awgur@0 | 27 В методах принимающих `<tt class="remarkup-monospaced">db</tt>`, ему нужно передавать объект <tt class="remarkup-monospaced">connection</tt> `<tt class="remarkup-monospaced">DB API 2</tt>` стандартный для <tt class="remarkup-monospaced">Python</tt>. |
| awgur@0 | 28 |
| awgur@0 | 29 БД, за версией которой мы следим, естественно должна взаимодействовать посредством простого <tt class="remarkup-monospaced">SQL</tt>. Модуль не выполняет каких-то сложных манипуляций, а простым `<tt class="remarkup-monospaced">SELECT</tt>` запрашивает данные, и исполняет `<tt class="remarkup-monospaced">UPDATE</tt>` при обновлении данных о версии |
| awgur@0 | 30 |
| awgur@0 | 31 #### Структура файла схемы и файлов изменений |
| awgur@0 | 32 |
| awgur@0 | 33 Файл схемы должен состоять из отдельных команд на изменение схемы разделённых маркетом `<tt class="remarkup-monospaced">--</tt>`, который должен идти первым не пробельным символом. По данному маркеру происходит разбиение файла на отдельные команды. После этих символов содержание остальной строки игнорируется, а сама строка в команду не входит. |
| awgur@0 | 34 |
| awgur@0 | 35 Каждая команда исполняется отдельно и после её выполнения происходит <tt class="remarkup-monospaced">commit</tt>. Поэтому необходимо **внимательно** следить за согласованностью данных после применения команды. |
| awgur@0 | 36 |
| awgur@0 | 37 **Имена файлов изменений** должны оканчиваться на <tt class="remarkup-monospaced">.sql</tt> (регистр не важен) и первые символы до точки должны приводится к числу. Данное число будет версией, к торовой данный файл приводит схему. |
| awgur@0 | 38 |
| awgur@0 | 39 То есть имя файла рекомендуется составлять из 3-х компонентов, разделённых точками: |
| awgur@0 | 40 |
| awgur@0 | 41 ``` |
| awgur@0 | 42 00001.some_comment.sql |
| awgur@0 | 43 ``` |
| awgur@0 | 44 |
| awgur@0 | 45 **где:** |
| awgur@0 | 46 |
| awgur@0 | 47 - `<tt class="remarkup-monospaced">00001</tt>` - версия, количество нулей роли не играет |
| awgur@0 | 48 - `<tt class="remarkup-monospaced">some_comment</tt>` - пояснение к изменению, не является обязательным |
| awgur@0 | 49 - `<tt class="remarkup-monospaced">sql</tt>` - расширение файла, относящее его к <tt class="remarkup-monospaced">SQL</tt>. |
| awgur@0 | 50 |
| awgur@0 | 51 ### Документация |
| awgur@0 | 52 |
| awgur@0 | 53 #### Классы |
| awgur@0 | 54 |
| awgur@0 | 55 <div class="remarkup-table-wrap" id="bkmrk-"></div><div class="remarkup-table-wrap" id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-"><div class="remarkup-table-wrap"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 21.3818%;"></col><col style="width: 78.5935%;"></col></colgroup><tbody><tr><th class="align-center" style="background-color: rgb(236, 240, 241); vertical-align: bottom;">**Имя класса**</th><th class="align-center" style="background-color: rgb(236, 240, 241); vertical-align: bottom;">**Описание**</th></tr><tr><td>`<tt class="remarkup-monospaced">MigrateManager</tt>`</td><td>Менеджер миграции. Выполняет всю работу</td></tr><tr><td>`<tt class="remarkup-monospaced">MigrateError</tt>`</td><td>Класс собственных исключений модуля</td></tr></tbody></table> |
| awgur@0 | 56 |
| awgur@0 | 57 </div></div>#### Методы класса `<tt class="remarkup-monospaced">MigrateManager</tt>` |
| awgur@0 | 58 |
| awgur@0 | 59 ##### Конструктор |
| awgur@0 | 60 |
| awgur@0 | 61 **Параметры:** |
| awgur@0 | 62 |
| awgur@0 | 63 <table border="1" id="bkmrk-control_table-str-o-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 14.953%;"></col><col style="width: 10.8749%;"></col><col style="width: 4.36944%;"></col><col style="width: 69.6543%;"></col></colgroup><tbody><tr><td>`<tt class="remarkup-monospaced">control_table</tt>`</td><td>`<tt class="remarkup-monospaced">str</tt>`</td><td>`<tt class="remarkup-monospaced">O</tt>`</td><td>Имя таблицы, хранящей версию (схема её дана выше)</td></tr><tr><td>`<tt class="remarkup-monospaced">migrate_env</tt>`</td><td>`<tt class="remarkup-monospaced">str(path)</tt>`</td><td>`<tt class="remarkup-monospaced">O</tt>`</td><td>Каталог с файлами миграции. Структура описана выше</td></tr></tbody></table> |
| awgur@0 | 64 |
| awgur@0 | 65 **Выполняет:** общие проверки среды, команд на БД не вызывает |
| awgur@0 | 66 |
| awgur@0 | 67 ##### `<tt class="remarkup-monospaced">init_db</tt>` |
| awgur@0 | 68 |
| awgur@0 | 69 **Параметры:** |
| awgur@0 | 70 |
| awgur@0 | 71 <table border="1" id="bkmrk-db-%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82-%D0%91%D0%94-o-%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 7.78547%;"></col><col style="width: 11.6164%;"></col><col style="width: 4.44811%;"></col><col style="width: 76.1253%;"></col></colgroup><tbody><tr><td>`<tt class="remarkup-monospaced">db</tt>`</td><td>`<tt class="remarkup-monospaced">Объект БД</tt>`</td><td>`<tt class="remarkup-monospaced">O</tt>`</td><td>Объект БД, должен соответствовать описанному выше интерфейсу</td></tr></tbody></table> |
| awgur@0 | 72 |
| awgur@0 | 73 **Выполняет:** Исполнение на БД команд из файла начальной схемы |
| awgur@0 | 74 |
| awgur@0 | 75 ##### `<tt class="remarkup-monospaced">check</tt>` |
| awgur@0 | 76 |
| awgur@0 | 77 **Параметры:** |
| awgur@0 | 78 |
| awgur@0 | 79 <table border="1" id="bkmrk-db-%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82-%D0%91%D0%94-o-%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA-1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 4.81957%;"></col><col style="width: 12.4815%;"></col><col style="width: 4.50132%;"></col><col style="width: 78.0493%;"></col></colgroup><tbody><tr><td>`<tt class="remarkup-monospaced"></tt>db`</td><td>`Объект БД`</td><td>`O`</td><td>Объект БД, должен соответствовать описанному выше интерфейсу</td></tr></tbody></table> |
| awgur@0 | 80 |
| awgur@0 | 81 **Выполняет:** Проверку версию схемы БД, и исполнение на БД команд из файлов версий выше текущей на БД. |
| awgur@0 | 82 |
| awgur@0 | 83 <p class="callout warning">При отсутствии таблицы модуль просто возбудит исключение, причём это исключение возбудит сама база, поскольку запрошенной таблицы в ней не окажется.</p> |