Dolt — это база данных SQL, которую можно разветвлять, клонировать, разветвлять, объединять, отправлять и извлекать точно так же, как репозиторий Git.
Подключайтесь к Dolt, как к любой базе данных MySQL, для чтения или изменения схемы и данных. Функциональность контроля версий предоставляется в SQL через системные таблицы, функции и процедуры.
Или используйте интерфейс командной строки, похожий на Git, для импорта файлов CSV, фиксации изменений, отправки их на удаленный компьютер или объединения изменений вашего товарища по команде. Все команды, которые вы знаете для Git, работают точно так же и для Dolt.
Файлы версий Git. Таблицы версий Dolt. Как будто у Git и MySQL родился ребенок.
Мы также создали DoltHub — место для обмена базами данных Dolt. Мы размещаем общедоступные данные бесплатно. Если вы хотите разместить свою собственную версию DoltHub, у нас есть DoltLab. Если вы хотите, чтобы мы запустили для вас сервер Dolt, у нас есть Hosted Dolt. Если вы ищете версию Dolt для Postgres, мы создали DoltgreSQL. Внимание, это ранняя Альфа. Dolt готов к производству.
Присоединяйтесь к нам в Discord, чтобы поздороваться и задать вопросы, или ознакомьтесь с нашей дорожной картой, чтобы узнать, что мы будем делать дальше.
Много вещей! Dolt — это в целом полезный инструмент, имеющий бесчисленное множество применений. Но если вам нужны идеи, вот как люди используют это до сих пор.
Dolt можно настроить как копию существующей базы данных MySQL или MariaDB, используя стандартную репликацию бинлога MySQL. Каждая запись становится фиксацией Dolt. Это отличный способ получить преимущества контроля версий Dolt и сохранить существующую базу данных MySQL или MariaDB.
Интерфейс командной строки dolt
имеет те же команды, что и git
, с некоторыми дополнениями.
$ dolt Valid commands for dolt are init - Create an empty Dolt data repository. status - Show the working tree status. add - Add table changes to the list of staged table changes. diff - Diff a table. reset - Remove table changes from the list of staged table changes. clean - Remove untracked tables from working set. commit - Record changes to the repository. sql - Run a SQL query against tables in repository. sql-server - Start a MySQL-compatible server. log - Show commit logs. branch - Create, list, edit, delete branches. checkout - Checkout a branch or overwrite a table from HEAD. merge - Merge a branch. conflicts - Commands for viewing and resolving merge conflicts. cherry-pick - Apply the changes introduced by an existing commit. revert - Undo the changes introduced in a commit. clone - Clone from a remote data repository. fetch - Update the database from a remote data repository. pull - Fetch from a dolt remote data repository and merge. push - Push to a dolt remote. config - Dolt configuration. remote - Manage set of tracked repositories. backup - Manage a set of server backups. login - Login to a dolt remote host. creds - Commands for managing credentials. ls - List tables in the working set. schema - Commands for showing and importing table schemas. table - Commands for copying, renaming, deleting, and exporting tables. tag - Create, list, delete tags. blame - Show what revision and author last modified each row of a table. constraints - Commands for handling constraints. migrate - Executes a database migration to use the latest Dolt data format. read-tables - Fetch table(s) at a specific commit into a new dolt repo gc - Cleans up unreferenced data from the repository. filter-branch - Edits the commit history using the provided query. merge-base - Find the common ancestor of two commits. version - Displays the current Dolt cli version. dump - Export all tables in the working set into a file.
Dolt — это одна программа размером около 103 мегабайт.
dolt $ du -h /Users/timsehn/go/bin/dolt 103M/Пользователи/timsehn/go/bin/dolt
Его действительно легко установить. Загрузите его и поместите на свой PATH
. У нас есть множество способов сделать это еще проще для большинства платформ.
Для установки в системах на базе Linux или Mac выполните следующую команду в своем терминале:
sudo bash -c 'curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | bash'
Это загрузит последнюю версию dolt
и поместит ее в /usr/local/bin/
, который, вероятно, находится в вашем $PATH
.
Скрипту установки требуется sudo, чтобы поместить dolt
в /usr/local/bin
. Если у вас нет привилегий root или вам неудобно запускать с ними скрипт, вы можете загрузить двоичный файл dolt для вашей платформы из последней версии, разархивировать его и поместить двоичный файл куда-нибудь в свой $PATH
.
Dolt упакован в официальные репозитории Arch Linux.
pacman -S dolt
Dolt находится на Homebrew и обновляется в каждом выпуске.
brew install dolt
В macOS Dolt также можно установить через порт, управляемый сообществом, через MacPorts:
установка порта sudo, болван
Загрузите последнюю версию установщика Microsoft (файл .msi
) и запустите ее.
Информацию о запуске в Windows см. здесь.
Вы можете установить dolt
с помощью Chocolatey:
шоколадная установка, болван
Существуют следующие официальные образы Docker для Dolt:
dolthub/dolt
для запуска Dolt в качестве инструмента CLI.
dolthub/dolt-sql-server
для запуска Dolt в режиме сервера.
Убедитесь, что у вас установлен Go и что go
находится на вашем пути. Dolt зависит от cgo, поэтому вам также понадобится работающий компилятор C и набор инструментов.
Клонируйте этот репозиторий и перейдите в каталог go
. Затем запустите:
go install ./cmd/dolt
Вывод будет в $GOPATH/bin
, который по умолчанию равен ~/go/bin
. Чтобы протестировать вашу сборку, попробуйте:
~/go/bin/dolt version
Убедитесь, что установка прошла успешно, запустив dolt
в терминале.
$ dolt Valid commands for dolt are [...]
Настройте dolt
указав свое имя пользователя и адрес электронной почты, которые вам понадобятся для создания коммитов. Команды работают точно так же, как и git.
$ dolt config --global --add user.email [email protected] $ dolt config --global --add user.name "YOUR NAME"
Dolt нужно место для хранения ваших баз данных. Я собираюсь поместить свои базы данных в ~/dolt
.
% cd ~% mkdir болван % CD болван
Все созданные вами базы данных будут храниться в этом каталоге. Итак, в этом примере каталог с именем getting_started
будет создан здесь после запуска create database getting_started
. Переход к ~/dolt/getting_started
позволит вам получить доступ к этой базе данных с помощью командной строки Dolt.
ПРИМЕЧАНИЕ. В этом примере каталог getting_started
будет создан после запуска команды create database getting_started;
в оболочке SQL в разделе «Создание схемы». Ничего не делайте, кроме создания каталога и перехода к нему.
Dolt поставляется со встроенным MySQL-совместимым сервером баз данных. Чтобы запустить его, вы используете команду dolt sql-server
. Выполнение этой команды запускает сервер на порту 3306.
болван sql-сервера Запуск сервера с конфигурацией HP="localhost:3306"|T="28800000"|R="false"|L="info"
Ваш терминал просто будет висеть там. Это означает, что сервер работает. Любые ошибки будут напечатаны в этом терминале. Просто оставьте его там и откройте новый терминал.
В новом терминале мы теперь будем подключаться к работающему серверу базы данных с помощью клиента. Dolt также поставляется с MySQL-совместимым клиентом.
% dolt -u root -p "" sql# Добро пожаловать в клиент Dolt MySQL.# Операторы должны завершаться с помощью ';'.# "exit" или "quit" (или Ctrl-D) для выхода.mysql>
В другом терминале, где вы запустили dolt sql-server
, вы увидите следующую строку журнала.
2022-06-06T13:14:32-07:00 INFO [conn 1] NewConnection {DisableClientMultiStatements=false}
Вы на связи!
Пока мы здесь, давайте возьмем копию MySQL, чтобы мы могли подключиться к этому клиенту. Перейдите к документации по началу работы с MySQL и установите MySQL на свой компьютер. Я использовал Homebrew для установки MySQL на свой Mac.
MySQL поставляется с сервером MySQL под названием mysqld
и клиентом MySQL под названием mysql
. Вас интересует только клиент. Следуя инструкциям из документации MySQL, убедитесь, что на вашем пути есть копия клиента mysql
:
% mysql --версия mysql версии 8.0.29 для Macos12.2 на x86_64 (доморощенный)
Теперь, чтобы подключить клиент mysql
к Dolt, вы собираетесь принудительно использовать клиент MySQL через интерфейс TCP, передав хост и порт. По умолчанию используется интерфейс сокета, который поддерживает Dolt, но доступен только на localhost
. Так что лучше TCP-интерфейс похвастаться. Клиент MySQL также требует, чтобы вы указали пользователя, в данном случае root
.
% mysql --host 127.0.0.1 --port 3306 -uroot Добро пожаловать в монитор MySQL. Команды заканчиваются ; или г. Ваш идентификатор подключения к MySQL – 2. Версия сервера: 5.7.9-Витесс Авторские права (c) 2000, 2022 г., Oracle и/или ее дочерние компании. Oracle является зарегистрированной торговой маркой корпорации Oracle и/или ее филиалы. Другие названия могут быть товарными знаками соответствующих владельцы. Введите «помощь»; или 'h' для помощи. Введите «c», чтобы очистить текущий оператор ввода. MySQL>
Опять же, чтобы убедиться, что клиент действительно подключен, вы должны увидеть следующее в терминале dolt sql-server
2022-06-06T13:26:55-07:00 INFO [conn 2] NewConnection {DisableClientMultiStatements=false}
Как видите, Dolt поддерживает любой MySQL-совместимый клиент. Dolt поставляется с клиентом, но вы можете использовать любой клиент MySQL, например тот, который поставляется с MySQL.
Теперь мы действительно готовы сделать что-то интересное. Я останусь в клиенте mysql
и выполню следующие инструкции SQL, чтобы создать базу данных под названием getting_started
. В базе данных getting_started
будет три таблицы: employees
, teams
и employees_teams
.
mysql> create database getting_started; Query OK, 1 row affected (0.04 sec) mysql> use getting_started; Database changed mysql> create table employees ( id int, last_name varchar(255), first_name varchar(255), primary key(id)); Query OK, 0 rows affected (0.01 sec) mysql> create table teams ( id int, team_name varchar(255), primary key(id)); Query OK, 0 rows affected (0.00 sec) mysql> create table employees_teams( team_id int, employee_id int, primary key(team_id, employee_id), foreign key (team_id) references teams(id), foreign key (employee_id) references employees(id)); Query OK, 0 rows affected (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | employees_teams | | teams | +---------------------------+ 3 rows in set (0.00 sec)
Dolt поддерживает внешние ключи, вторичные индексы, триггеры, проверочные ограничения и хранимые процедуры. Это современная многофункциональная база данных SQL.
Пришло время использовать вашу первую функцию Dolt. Мы собираемся сделать коммит Dolt. Коммит Dolt позволяет вам путешествовать во времени и увидеть родословную. Делайте коммит Dolt каждый раз, когда захотите восстановить или сравнить данные с данным моментом времени.
Dolt предоставляет функциональность контроля версий через интерфейс в стиле Git. В командной строке команды Dolt сопоставляются точно с их эквивалентом в Git, причем целевыми объектами являются таблицы, а не файлы. В SQL Dolt предоставляет операции чтения с контролем версий как системные таблицы, а операции записи с контролем версий — как хранимые процедуры.
Именование системных таблиц и хранимых процедур соответствует шаблону dolt_
. Таким образом, dolt add
в CLI становится dolt_add
как хранимая процедура. Передача параметров также соответствует модели командной строки. Например, чтобы указать таблицы для добавления, отправьте имена таблиц в качестве параметров процедуры dolt_add
. Для именованных аргументов, таких как отправка сообщения в команду dolt_commit
используйте два аргумента последовательно, например ('-m', 'This is a message')
. Если вы знаете Git, процедуры контроля версий и системные таблицы должны показаться вам знакомыми.
Итак, мы добавляем и фиксируем нашу новую схему следующим образом.
mysql> call dolt_add('teams', 'employees', 'employees_teams'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.03 sec) mysql> call dolt_commit('-m', 'Created initial schema'); +----------------------------------+ | hash | +----------------------------------+ | ne182jemgrlm8jnjmoubfqsstlfi1s98 | +----------------------------------+ 1 row in set (0.02 sec) mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ 2 rows in set (0.01 sec)
Вот оно. Ваша схема создана, и у вас есть фиксация Dolt, отслеживающая ее создание, как показано в системной таблице dolt_log
.
Обратите внимание: фиксация Dolt отличается от стандартной транзакции SQL COMMIT
. В данном случае я запускаю базу данных с включенным AUTOCOMMIT
, поэтому каждый оператор SQL автоматически генерирует транзакцию COMMIT
. Если вы хотите, чтобы система генерировала фиксацию Dolt для каждой транзакции, используйте системную переменную @@dolt_transaction_commit
.
Теперь я собираюсь заполнить базу данных несколькими сотрудниками DoltHub. Затем я распределим сотрудников на две команды: инженерную и продающую. На старте у генерального директора много обязанностей, поэтому его назначают в несколько команд.
mysql> insert into employees values (0, 'Sehn', 'Tim'), (1, 'Hendriks', 'Brian'), (2, 'Son','Aaron'), (3, 'Fitzgerald', 'Brian'); Query OK, 4 rows affected (0.01 sec) mysql> select * from employees where first_name='Brian'; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 1 | Hendriks | Brian | | 3 | Fitzgerald | Brian | +------+------------+------------+ 2 rows in set (0.00 sec) mysql> insert into teams values (0, 'Engineering'), (1, 'Sales'); Query OK, 2 rows affected (0.00 sec) mysql> insert into employees_teams values (0,0), (1,0), (2,0), (0,1), (3,1); ERROR 1452 (HY000): cannot add or update a child row - Foreign key violation on fk: `rv9ek7ft`, table: `employees_teams`, referenced table: `teams`, key: `[2]`
Упс, я нарушил ограничение. Похоже, я создал таблицу с командами, а не с сотрудниками. Вы всегда должны указывать столбцы при вставке, а не полагаться на естественный порядок. Так мне и надо! Dolt обладает всеми возможностями современной реляционной базы данных SQL для обеспечения целостности данных.
mysql> insert into employees_teams(employee_id, team_id) values (0,0), (1,0), (2,0), (0,1), (3,1); Query OK, 5 rows affected (0.01 sec) mysql> select first_name, last_name, team_name from employees join employees_teams on (employees.id=employees_teams.employee_id) join teams on (teams.id=employees_teams.team_id) where team_name='Engineering'; +------------+-----------+-------------+ | first_name | last_name | team_name | +------------+-----------+-------------+ | Tim | Sehn | Engineering | | Brian | Hendriks | Engineering | | Aaron | Son | Engineering | +------------+-----------+-------------+ 3 rows in set (0.00 sec)
Вроде все вставлено и правильно. Мне удалось составить список членов команды разработчиков, используя эти три таблицы JOIN
. Dolt поддерживает до двенадцати таблиц JOIN
. Опять же, Dolt — это современная реляционная база данных SQL в сочетании с контролем версий в стиле Git.
А что, если вы хотите увидеть, что изменилось в вашем рабочем наборе, прежде чем делать коммит? Вы используете системные таблицы dolt_status
и dolt_diff_
.
mysql> select * from dolt_status; +-----------------+--------+----------+ | table_name | staged | status | +-----------------+--------+----------+ | teams | 0 | modified | | employees | 0 | modified | | employees_teams | 0 | modified | +-----------------+--------+----------+ 3 rows in set (0.01 sec) mysql> select * from dolt_diff_employees; +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ | to_last_name | to_first_name | to_id | to_commit | to_commit_date | from_last_name | from_first_name | from_id | from_commit | from_commit_date | diff_type | +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ | Sehn | Tim | 0 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Hendriks | Brian | 1 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Son | Aaron | 2 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Fitzgerald | Brian | 3 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ 4 rows in set (0.00 sec)
Как вы можете видеть из различий, я добавил правильные значения в таблицу employees
. Раньше значения были NULL
, а теперь они заполнены.
Давайте закончим еще одним коммитом Dolt, на этот раз добавив все затронутые таблицы с помощью -am
.
mysql> call dolt_commit('-am', 'Populated tables with data'); +----------------------------------+ | hash | +----------------------------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | +----------------------------------+ 1 row in set (0.02 sec)
Вы можете просмотреть журнал с помощью dolt_log
и посмотреть, какие таблицы были изменены в каждом коммите, используя dolt_diff
без области видимости. dolt_diff
без области действия сообщает вам, были ли изменены схема, данные или и то, и другое в этом конкретном коммите для таблицы.
mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ 3 rows in set (0.00 sec) mysql> select * from dolt_diff; +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ | commit_hash | table_name | committer | email | date | message | data_change | schema_change | +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | teams | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees_teams | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees_teams | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | teams | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ 6 rows in set (0.00 sec)
Dolt поддерживает отмену изменений через call dolt_reset()
. Давайте представим, что я случайно уронил стол.
mysql> drop table employees_teams; Query OK, 0 rows affected (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | teams | +---------------------------+ 2 rows in set (0.00 sec)
В традиционной базе данных это может иметь катастрофические последствия. В Dolt вы находитесь в одной команде от того, чтобы вернуть свой стол.
mysql> call dolt_reset('--hard'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | employees_teams | | teams | +---------------------------+ 3 rows in set (0.01 sec)
Dolt делает операционные базы данных менее подверженными ошибкам. Вы всегда можете отменить текущие изменения или вернуться к заведомо исправному состоянию. У вас также есть возможность отменить определенные коммиты с помощью dolt_revert()
. Даже если вы случайно запустили drop database
не в той базе данных, Dolt позволит вам отменить это, вызвав хранимую процедуру dolt_undrop()
.
Ненавидите командную строку? Давайте воспользуемся Tableplus, чтобы внести некоторые изменения. Tableplus — это бесплатная рабочая среда SQL. Следуйте инструкциям по установке с их сайта.
Теперь для подключения вы должны выбрать MySQL в качестве типа подключения. Затем введите имя для вашего подключения, getting_started
в качестве базы данных и root
в качестве пользователя.
Нажмите «Подключиться», и вы увидите знакомый графический интерфейс рабочей среды базы данных.
Чтобы внести изменения в ветку, я использую хранимую процедуру dolt_checkout()
. Использование опции -b
создает ветку, как в Git.
Tableplus дает мне возможность вводить многострочный сценарий SQL на вкладке SQL. Я ввел следующий SQL-код, чтобы извлечь ветку, обновить, вставить, удалить и, наконец, зафиксировать мои изменения.
вызвать dolt_checkout('-b','modifications');обновить сотрудников SET first_name='Тимоти' где first_name='Тим';вставить значения сотрудников INTO (id, first_name, Last_name) (4,'Daylon', 'Wilkins') ;вставить в сотрудники_команды(team_id, сотрудник_ид) значения (0,4);удалить из сотрудников_команд, где сотрудник_ид=0 и team_id=1; вызов dolt_commit('-am', 'Модификации в ветке');
Вот результат в Tableplus.
Вернувшись в свой терминал, я не вижу изменений таблицы, сделанных в Tableplus, потому что они произошли в другой ветке, отличной от той, которую я проверил в своем сеансе.
mysql> select * from dolt_branches; +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ | name | hash | latest_committer | latest_committer_email | latest_commit_date | latest_commit_message | +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ | main | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | modifications | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | [email protected] | 2022-06-07 16:41:49.847 | Modifications on a branch | +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ 2 rows in set (0.00 sec) mysql> select active_branch(); +-----------------+ | active_branch() | +-----------------+ | main | +-----------------+ 1 row in set (0.00 sec) mysql> select * from employees; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 0 | Sehn | Tim | | 1 | Hendriks | Brian | | 2 | Son | Aaron | | 3 | Fitzgerald | Brian | +------+------------+------------+ 4 rows in set (0.00 sec)
Я могу запросить ветку независимо от того, что я проверил, as of
синтаксис SQL.
mysql> select * from employees as of 'modifications'; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 0 | Sehn | Timothy | | 1 | Hendriks | Brian | | 2 | Son | Aaron | | 3 | Fitzgerald | Brian | | 4 | Wilkins | Daylon | +------+------------+------------+ 5 rows in set (0.01 sec)
Если я хочу увидеть разницу между двумя ветвями, я могу использовать табличную функцию dolt_diff()
. В качестве аргументов он принимает две ветки и имя таблицы.
mysql> select * from dolt_diff('main', 'modifications', 'employees'); +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ | to_last_name | to_first_name | to_id | to_commit | to_commit_date | from_last_name | from_first_name | from_id | from_commit | from_commit_date | diff_type | +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ | Sehn | Timothy | 0 | modifications | 2022-06-07 16:41:49.847 | Sehn | Tim | 0 | main | 2022-06-07 16:39:32.066 | modified | | Wilkins | Daylon | 4 | modifications | 2022-06-07 16:41:49.847 | NULL | NULL | NULL | main | 2022-06-07 16:39:32.066 | added | +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ 2 rows in set (0.00 sec)
Как видите, с помощью Dolt у вас есть все возможности ветвей и различий в стиле Git в базе данных SQL.
Я также могу вносить изменения в схему в ветках для изолированного тестирования новой схемы. Я собираюсь добавить столбец start_date
в новую ветку и заполнить его.
mysql> call dolt_checkout('-b', 'schema_changes'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> alter table employees add column start_date date; Query OK, 0 rows affected (0.02 sec) mysql> update employees set start_date='2018-09-08'; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> update employees set start_date='2021-04-19' where last_name='Fitzgerald'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Tim | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | +------+------------+------------+------------+ 4 rows in set (0.00 sec) mysql> call dolt_commit('-am', 'Added start_date column to employees'); +----------------------------------+ | hash | +----------------------------------+ | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | +----------------------------------+ 1 row in set (0.01 sec)
Изменение схемы в ветке дает вам новый метод изолированного интеграционного тестирования новых изменений схемы.
Предположим, что все тестирование новой схемы в ветке schema_changes
и данных в ветке modifications
завершилось безупречно. Пришло время объединить все наши изменения в main
. Это делается с помощью хранимой процедуры dolt_merge
.
mysql> call dolt_checkout('main'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> select * from dolt_status; Empty set (0.00 sec) mysql> call dolt_merge('schema_changes'); +--------------+ | no_conflicts | +--------------+ | 1 | +--------------+ 1 row in set (0.01 sec) mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Tim | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | +------+------------+------------+------------+ 4 rows in set (0.00 sec)
Изменение схемы прошло успешно. Теперь у нас есть даты начала. Изменения данных следующие.
mysql> call dolt_merge('modifications'); +--------------+ | no_conflicts | +--------------+ | 1 | +--------------+ 1 row in set (0.02 sec) mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Timothy | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | | 4 | Wilkins | Daylon | NULL | +------+------------+------------+------------+ 5 rows in set (0.00 sec)
Данные также меняются успешно. Как видите, теперь я «Тимоти» вместо «Тим», добавлен Дейлон, и у всех нас есть даты начала, за исключением Дейлона, который был добавлен в другой ветке.
mysql> select first_name, last_name, team_name from employees join employees_teams on (employees.id=employees_teams.employee_id) join teams on (teams.id=employees_teams.team_id) where team_name='Sales'; +------------+------------+-----------+ | first_name | last_name | team_name | +------------+------------+-----------+ | Brian | Fitzgerald | Sales | +------------+------------+-----------+ 1 row in set (0.01 sec)
Я также ушел из отдела продаж. Инженерия – это жизнь.
Мне приходится зафиксировать все мои изменения, поскольку последнее слияние не было слиянием с ускоренной перемоткой вперед.
mysql> call dolt_commit('-m', 'Merged all branches'); +----------------------------------+ | hash | +----------------------------------+ | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | +----------------------------------+ 1 row in set (0.01 sec) mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim Sehn | [email protected] | 2022-06-07 17:10:02.07 | Merged all branches | | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | Tim Sehn | [email protected] | 2022-06-07 16:44:37.513 | Added start_date column to employees | | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | [email protected] | 2022-06-07 16:41:49.847 | Modifications on a branch | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ 6 rows in set (0.00 sec)
Теперь у нас есть база данных со всеми изменениями схемы и данных, объединенная и готовая к использованию.
Какой коммит изменил мое имя? С Dolt у вас есть происхождение каждой ячейки вашей базы данных. Давайте воспользуемся dolt_history_
и dolt_diff_
чтобы изучить особенности происхождения в Dolt.
dolt_history_
показывает состояние строки при каждом коммите.
mysql> select * from dolt_history_employees where id=0 order by commit_date; +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ | id | last_name | first_name | start_date | commit_hash | committer | commit_date | +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ | 0 | Sehn | Tim | NULL | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | 2022-06-07 16:39:32.066 | | 0 | Sehn | Timothy | NULL | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | 2022-06-07 16:41:49.847 | | 0 | Sehn | Tim | 2018-09-08 | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | Tim Sehn | 2022-06-07 16:44:37.513 | | 0 | Sehn | Timothy | 2018-09-08 | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim Sehn | 2022-06-07 17:10:02.07 | +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ 4 rows in set (0.00 sec)
dolt_diff_
позволяет фильтровать историю так, чтобы она фиксировалась только при изменении рассматриваемой ячейки. В данном случае меня интересуют коммиты, меняющие мое имя. Обратите внимание: есть два коммита, которые изменили мое имя, потому что один — исходное изменение, а второй — коммит слияния.
mysql> select to_commit,from_first_name,to_first_name from dolt_diff_employees where (from_id=0 or to_id=0) and (from_first_name <> to_first_name or from_first_name is NULL) order by to_commit_date; +----------------------------------+-----------------+---------------+ | to_commit | from_first_name | to_first_name | +----------------------------------+-----------------+---------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | NULL | Tim | | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim | Timothy | | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim | Timothy | +----------------------------------+-----------------+---------------+ 3 rows in set (0.01 sec)
Dolt предоставляет мощные возможности аудита данных вплоть до отдельных ячеек. Когда, как и почему каждая ячейка вашей базы данных со временем изменилась?
Теперь, когда вы разобрались с Dolt, перейдите к нашей документации. О том, над чем мы работаем, вы также можете прочитать в нашем блоге.