Dolt는 Git 저장소처럼 분기, 복제, 분기, 병합, 푸시 및 풀을 수행할 수 있는 SQL 데이터베이스입니다.
MySQL 데이터베이스처럼 Dolt에 연결하여 스키마와 데이터를 읽거나 수정하세요. 버전 제어 기능은 시스템 테이블, 함수 및 프로시저를 통해 SQL에 표시됩니다.
또는 Git과 유사한 명령줄 인터페이스를 사용하여 CSV 파일을 가져오고, 변경 사항을 커밋하고, 원격으로 푸시하거나, 팀원의 변경 사항을 병합할 수 있습니다. Git에 대해 알고 있는 모든 명령은 Dolt에서도 동일하게 작동합니다.
Git 버전 파일. Dolt 버전 테이블. Git과 MySQL이 아기를 낳은 것과 같습니다.
우리는 또한 Dolt 데이터베이스를 공유하는 장소인 DoltHub를 구축했습니다. 우리는 무료로 공개 데이터를 호스팅합니다. 자신만의 DoltHub 버전을 호스팅하고 싶다면 DoltLab이 있습니다. 귀하를 위해 Dolt 서버를 운영하기를 원하신다면 Hosted Dolt가 있습니다. Dolt의 Postgres 버전을 찾고 있다면 DoltgreSQL을 구축했습니다. 경고, 아직 초기 알파입니다. Dolt는 생산 준비가 되어 있습니다.
Discord에 참여하여 인사하고 질문을 하거나 로드맵을 확인하여 다음에 무엇을 구축할지 알아보세요.
많은 것! Dolt는 수많은 응용 프로그램에 일반적으로 유용한 도구입니다. 하지만 몇 가지 아이디어를 원하신다면 지금까지 사람들이 어떻게 사용하고 있는지 살펴보세요.
Dolt는 표준 MySQL binlog 복제를 사용하여 기존 MySQL 또는 MariaDB 데이터베이스의 복제본으로 설정할 수 있습니다. 모든 쓰기는 Dolt 커밋이 됩니다. 이는 Dolt의 버전 제어 이점을 얻고 기존 MySQL 또는 MariaDB 데이터베이스를 유지하는 좋은 방법입니다.
dolt
CLI에는 몇 가지 추가 기능을 포함하여 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는 ~103MB의 단일 프로그램입니다.
dolt $ du -h /Users/timsehn/go/bin/dolt 1억 3백만 /사용자/timsehn/go/bin/dolt
설치가 정말 쉽습니다. 다운로드하여 PATH
에 넣으세요. 대부분의 플랫폼에서 이를 더욱 쉽게 만들 수 있는 다양한 방법이 있습니다.
Linux 또는 Mac 기반 시스템에 설치하려면 터미널에서 다음 명령을 실행하세요.
sudo bash -c 'curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | bash'
그러면 최신 dolt
릴리스가 다운로드되어 $PATH
에 있는 /usr/local/bin/
에 저장됩니다.
/usr/local/bin
에 dolt
넣으려면 설치 스크립트에 sudo가 필요합니다. 루트 권한이 없거나 이를 사용하여 스크립트를 실행하는 것이 불편하다면 최신 릴리스에서 플랫폼에 맞는 dolt 바이너리를 다운로드하여 압축을 풀고 $PATH
어딘가에 바이너리를 넣을 수 있습니다.
Dolt는 Arch Linux의 공식 저장소에 패키지되어 있습니다.
pacman -S dolt
Dolt는 Homebrew에 있으며 매 릴리스마다 업데이트됩니다.
brew install dolt
macOS에서는 MacPorts를 통해 커뮤니티 관리 포트를 통해 Dolt를 설치할 수도 있습니다.
sudo 포트 설치 dolt
릴리스의 최신 Microsoft 설치 프로그램( .msi
파일)을 다운로드하고 실행합니다.
Windows에서 실행하는 방법에 대한 자세한 내용은 여기를 참조하세요.
Chocolatey를 사용하여 dolt
설치할 수 있습니다.
초코 설치 돌트
Dolt에 대한 공식 Docker 이미지는 다음과 같습니다.
Dolt를 CLI 도구로 실행하기 위한 dolthub/dolt
.
서버 모드에서 Dolt를 실행하기 위한 dolthub/dolt-sql-server
.
Go가 설치되어 있고 go
경로에 있는지 확인하세요. Dolt는 cgo에 의존하므로 작동하는 C 컴파일러와 툴체인도 필요합니다.
이 저장소를 복제하고 go
디렉토리에 CD를 넣으세요. 그런 다음 다음을 실행하십시오.
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 dolt % CD 돌트
생성한 모든 데이터베이스는 이 디렉터리에 저장됩니다. 따라서 이 예에서는 create database getting_started
실행하면 여기에 getting_started
라는 디렉터리가 생성됩니다. ~/dolt/getting_started
로 이동하면 Dolt 명령줄을 사용하여 이 데이터베이스에 액세스할 수 있습니다.
참고: 이 예에서는 create Database getting_started를 실행한 후에 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을 설치하세요. Mac에 MySQL을 설치하기 위해 Homebrew를 사용했습니다.
MySQL에는 mysqld
라는 MySQL 서버와 mysql
이라는 MySQL 클라이언트가 함께 제공됩니다. 당신은 클라이언트에만 관심이 있습니다. MySQL 설명서의 지침을 따른 후 경로에 mysql
클라이언트 복사본이 있는지 확인하세요.
% mysql --버전 x86_64의 macos12.2용 mysql 버전 8.0.29(Homebrew)
이제 mysql
클라이언트를 Dolt에 연결하기 위해 호스트와 포트를 전달하여 TCP 인터페이스를 통해 MySQL 클라이언트를 강제로 실행하게 됩니다. 기본값은 Dolt가 지원하는 소켓 인터페이스이지만 localhost
에서만 사용할 수 있습니다. 따라서 TCP 인터페이스를 과시하는 것이 더 좋습니다. 또한 MySQL 클라이언트에서는 사용자(이 경우 root
를 지정해야 합니다.
% mysql --host 127.0.0.1 --port 3306 -uroot MySQL 모니터에 오신 것을 환영합니다. 명령은 ;로 끝납니다. 또는 g. 귀하의 MySQL 연결 ID는 2입니다. 서버 버전: 5.7.9-Vitess 저작권 (c) 2000, 2022, Oracle 및/또는 그 계열사. Oracle은 Oracle Corporation 및/또는 그 회사의 등록 상표입니다. 계열사. 다른 이름은 해당 회사의 상표일 수 있습니다. 소유자. '도움말'을 입력하세요. 또는 '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_
패턴을 따릅니다. 따라서 CLI의 dolt add
저장 프로시저로서 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_log
시스템 테이블에 표시된 대로 스키마가 생성되고 생성을 추적하는 Dolt 커밋이 있습니다.
Dolt 커밋은 표준 SQL 트랜잭션 COMMIT
와 다릅니다. 이 경우 AUTOCOMMIT
설정한 상태로 데이터베이스를 실행 중이므로 각 SQL 문이 자동으로 COMMIT
트랜잭션을 생성합니다. 시스템이 모든 트랜잭션에 대해 Dolt 커밋을 생성하도록 하려면 시스템 변수 @@dolt_transaction_commit
사용하세요.
이제 여기 DoltHub의 몇몇 직원으로 데이터베이스를 채우겠습니다. 그런 다음 직원을 엔지니어링 팀과 영업 팀이라는 두 팀에 배정하겠습니다. CEO는 스타트업에서 많은 직책을 맡으므로 여러 팀에 배정됩니다.
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는 최대 12개의 테이블 JOIN
을 지원합니다. 다시 말하지만, Dolt는 Git 스타일 버전 제어와 결합된 최신 SQL 관계형 데이터베이스입니다.
이제 커밋을 하기 전에 작업 세트에서 변경된 사항을 확인하려면 어떻게 해야 합니까? 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
이었지만 이제는 채워집니다.
이번에는 -am
사용하여 영향을 받는 모든 테이블을 추가하는 또 다른 Dolt 커밋으로 마무리하겠습니다.
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 Workbench입니다. 해당 웹사이트의 설치 지침을 따르세요.
이제 연결하려면 연결 유형으로 MySQL을 선택해야 합니다. 그런 다음 연결 이름을 입력하고, getting_started
데이터베이스로, root
사용자로 입력하세요.
연결을 클릭하면 친숙한 데이터베이스 워크벤치 GUI가 표시됩니다.
브랜치를 변경하려면 dolt_checkout()
저장 프로시저를 사용합니다. -b
옵션을 사용하면 Git과 마찬가지로 브랜치가 생성됩니다.
Tableplus를 사용하면 SQL 탭에 여러 줄의 SQL 스크립트를 입력할 수 있습니다. 분기를 체크아웃하고, 업데이트하고, 삽입하고, 삭제하고 마지막으로 Dolt가 변경 사항을 커밋하기 위해 다음 SQL을 입력했습니다.
dolt_checkout('-b','modifications') 호출;직원 업데이트 SET first_name='Timothy' 여기서 first_name='Tim';INSERT INTO 직원(id, first_name, last_name) 값(4,'Daylon', 'Wilkins') ;employee_teams(team_id, Employee_id) 값 (0,4)에 삽입; Employee_id=0인 Employees_teams에서 삭제 및 팀_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를 사용하면 SQL 데이터베이스에서 Git 스타일 분기 및 차이점의 모든 기능을 사용할 수 있습니다.
또한 새 스키마에 대한 격리된 테스트를 위해 분기에서 스키마를 변경할 수도 있습니다. 새 브랜치에 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)
데이터 변경에도 성공했습니다. 보시다시피 저는 이제 "Tim"이 아닌 "Timothy"이고 Daylon이 추가되었으며 다른 브랜치에 추가된 Daylon을 제외하고는 모두 시작 날짜가 있습니다.
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에 대한 느낌을 가지셨다면 이제 문서를 살펴보세요. 블로그에서 우리가 진행 중인 작업에 대해 읽어보실 수도 있습니다.