Я хотел бы представить недавно запущенный проект с открытым исходным кодом, предназначенный для миграции базы данных. Почему нам понадобится такой инструмент, когда существует множество инструментов миграции базы данных, которые существуют? Давайте погрузимся в детали. Нам попросили добавить некоторые новые функции в проект, который был возвращен вовремя. При входе в проект мы поняли, что структура базы данных не была разработана очень хорошо, имела сложные вопросы на таблицах. Мы решили переработать структуру базы данных и сохранить данные, как это было. Мы смотрели на многие инструменты для производства решения этого случая, однако они работали почти одинаково. В основном, процедура инструментов, получение старой структуры базы данных и преобразовывать типы данных, изменить структуру базы данных и перенести ее в другую базу данных. Мы разработали новую структуру базы данных и нашу основную цель сохранить данные. Нам нужно было предпринять данные из разных таблиц и передавать их на новую таблицу. Наверняка, другой вариант будет сбросить старую базу данных и изменить все там и импортировать его в новую базу данных. К счастью, мы не применяли этот Tecninique, мы решили сделать инструмент, который делает все это. Вот где история начинается Madmigration Отказ
Madmigration записан полностью в Python. Мы использовали силу SQLalchemy библиотека. В этом руководстве мы объясним детали того, как использовать безумию.
PIP Установить безумную Madmigration
или PIP3 устанавливает -U безумига
Вы можете проверить версию: МАДМИГРАЦИЯ --ВЕРСИЯ
Давайте начнем.
Например, у вас есть старая таблица базы данных MySQL с именем Пользователь
:
#Mysql CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `fname` varchar(10) NOT NULL, `lname` varchar(10) NOT NULL, `nick` varchar(10) NOT NULL, `email` varchar(15) NOT NULL, `pass` varchar(15) NOT NULL, `updated` TIMESTAMP NULL, `created` TIMESTAMP NOT NULL, `companyID` INT, PRIMARY KEY (`id`), FOREIGN KEY (companyID) REFERENCES company(`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
И вы хотите перенести эту таблицу на новый стол PostgreSQL с разными именами столбцов:
#postgresql CREATE TABLE public."User" ( created_at timestamp NOT NULL, updated_at timestamp NULL, id serial NOT NULL, "name" varchar NOT NULL, surname varchar NOT NULL, nickname varchar NOT NULL, email varchar NOT NULL, "password" varchar NOT NULL, CONSTRAINT "User_email_key" UNIQUE (email), CONSTRAINT "User_pkey" PRIMARY KEY (id), company_id integer REFERENCES company (id) ON DELETE SET NULL );
Тогда создайте Ямл
Файл Schema.yml
для объявления таблиц и столбцов. На первом этапе добавить Конфиги
раздел. Этот раздел предназначен для подключения к базе данных. Конфиги
раздел имеют два подраздела Sourceconfig
, PeritionConfig
:
version: 0.1.8 Configs: - SourceConfig: dbURI: "mysql://root:admin@127.0.0.1/old" - DestinationConfig: dbURI: "postgresql://root:admin@127.0.0.1/new"
Миграция
Раздел предназначен для описания информации о таблицах:
migrationTables: - migrationTable: SourceTable: name: user DestinationTable: name: User create: true
Облико напишите информацию о столбцах в МиграцияМоленки
раздел.
MigrationColumns: - sourceColumn: name: id destinationColumn: name: id options: primary_key: true type_cast: bigint
В случае создания иностранный ключ
Вы можете указать его в параметрах столбца. Определение Иностранный ключ
Варианты, такие как OnDelete, Onupdate
Отказ table_name
Параметр является ссылкой на таблицу, Column_name
это название ссылочной колонки.
- sourceColumn: name: companyID destinationColumn: name: company_id options: type_cast: int nullable: true foreign_key: table_name: company column_name: id ondelete: "SET NULL"
Не добавлено никаких опций SourceColumn
раздел, однако в PeritionColumn
раздел, который мы могли бы иметь Primary_key, NULLBALE, по умолчанию, индекс, уникальный, AUTOINCREMENT, Entertain_Key, длина, Type_cast
опции. Финал yaml Stutchure будет выглядеть так:
version: 0.1.8 Configs: - SourceConfig: dbURI: "mysql://root:admin@127.0.0.1/old" - DestinationConfig: dbURI: "postgresql://root:admin@127.0.0.1/new" migrationTables: - migrationTable: SourceTable: name: user DestinationTable: name: User create: True MigrationColumns: - sourceColumn: name: id destinationColumn: name: id options: primary_key: true type_cast: bigint - sourceColumn: name: fname destinationColumn: name: name options: type_cast: string - sourceColumn: name: lname destinationColumn: name: surname options: type_cast: string - sourceColumn: name: email destinationColumn: name: email options: type_cast: string unique: true - sourceColumn: name: nick destinationColumn: name: nickname options: type_cast: string - sourceColumn: name: pass destinationColumn: name: password options: type_cast: string - sourceColumn: name: updated destinationColumn: name: updated_at options: type_cast: datetime - sourceColumn: name: created destinationColumn: name: created_at options: type_cast: datetime - sourceColumn: name: companyID destinationColumn: name: company_id options: type_cast: int nullable: true foreign_key: table_name: company column_name: id ondelete: "SET NULL"
Кроме того, вы можете перенести ваши данные из RDBMS
к NoSQL
Отказ Ниже небольшого примера для данных миграции из PostgreSQL
к Монгодб
Отказ Работа на PostgreSQL
к Монгодб
Еще идет, мы добавим другие функции как можно скорее.
version: 0.1.8 Configs: - SourceConfig: dbURI: "postgresql://root:admin@localhost:5432/olddb" - DestinationConfig: dbURI: "mongodb://localhost:27017/mydb" migrationTables: - migrationTable: SourceTable: #postgresql table name name: company DestinationTable: #the collection name: name: Company MigrationColumns: - sourceColumn: name: id destinationColumn: name: id options: type_cast: uuid - sourceColumn: name: name destinationColumn: name: NAME options: type_cast: varchar - sourceColumn: name: created destinationColumn: name: CREATED options: type_cast: datetime - sourceColumn: name: email destinationColumn: name: EMAIL options: type_cast: string - sourceColumn: name: updated destinationColumn: name: UPDATED options: type_cast: datetime - sourceColumn: name: code destinationColumn: name: CODE options: type_cast: string
После завершения декларации файла YAML запустите следующую команду.
Madmigrate -f Schema.yaml.
В качестве альтернативы вы можете отделить логику миграции на несколько .ыл
или .json
файлы. Главное, один главный .yaml
Файл должен существовать, другие файлы должны быть импортированы в этот основной файл.
main.yaml
файл:
version: 1.1 Configs: - SourceConfig: dbURI: "mysql://root:admin@127.0.0.1/old" - DestinationConfig: dbURI: "postgresql://root:admin@127.0.0.1/new" migrationTables: - migrationTable: !import company.yaml - migrationTable: !import op_cond.json
Company.yaml
файл
SourceTable: name: company DestinationTable: name: company create: true MigrationColumns: - sourceColumn: name: id destinationColumn: name: id options: primary_key: true type_cast: uuid - sourceColumn: name: name destinationColumn: name: name options: length: 120 type_cast: varchar nullable: false - sourceColumn: name: created destinationColumn: name: created options: type_cast: datetime - sourceColumn: name: updated destinationColumn: name: updated options: type_cast: datetime nullable: true
Op_conds.json
файл
{ "SourceTable": { "name": "operation_conditions" }, "DestinationTable": { "name": "operation_conditions", "create": true }, "MigrationColumns": [ { "sourceColumn": { "name": "id" }, "destinationColumn": { "name": "id", "options": { "primary_key": true, "type_cast": "uuid" } } }, { "sourceColumn": { "name": "interest" }, "destinationColumn": { "name": "interest", "options": { "type_cast": "varchar", "length": 30, "nullable": false } } }, { "sourceColumn": { "name": "FIFD" }, "destinationColumn": { "name": "FIFD", "options": { "type_cast": "varchar", "length": 30, "nullable": false } } }, { "sourceColumn": { "name": "comission" }, "destinationColumn": { "name": "comission", "options": { "type_cast": "varchar", "length": 30, "nullable": false } } } ] }
В настоящее время мы не полностью реализованы все функциональные возможности для SQL
и NoSQL
Поэтому мы все еще развиваемся и добавляем новые функции на нем. Спасибо за удивительную работу нашему команда Для реализации этого инструмента.
Оригинал: “https://dev.to/turalmu95150474/madmigration-5d7g”