Я хотел бы представить недавно запущенный проект с открытым исходным кодом, предназначенный для миграции базы данных. Почему нам понадобится такой инструмент, когда существует множество инструментов миграции базы данных, которые существуют? Давайте погрузимся в детали. Нам попросили добавить некоторые новые функции в проект, который был возвращен вовремя. При входе в проект мы поняли, что структура базы данных не была разработана очень хорошо, имела сложные вопросы на таблицах. Мы решили переработать структуру базы данных и сохранить данные, как это было. Мы смотрели на многие инструменты для производства решения этого случая, однако они работали почти одинаково. В основном, процедура инструментов, получение старой структуры базы данных и преобразовывать типы данных, изменить структуру базы данных и перенести ее в другую базу данных. Мы разработали новую структуру базы данных и нашу основную цель сохранить данные. Нам нужно было предпринять данные из разных таблиц и передавать их на новую таблицу. Наверняка, другой вариант будет сбросить старую базу данных и изменить все там и импортировать его в новую базу данных. К счастью, мы не применяли этот 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”