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 ที่มีอยู่ของคุณโดยใช้การจำลองแบบ Binlog ของ MySQL มาตรฐาน การเขียนทุกครั้งจะกลายเป็นการคอมมิตของ 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 เป็นโปรแกรมเดี่ยว ~ 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
release ล่าสุดและวางไว้ /usr/local/bin/
ซึ่งอาจอยู่ใน $PATH
ของคุณ
สคริปต์การติดตั้งต้องการ sudo เพื่อใส่ dolt
/usr/local/bin
หากคุณไม่มีสิทธิ์รูทหรือไม่สะดวกใจที่จะรันสคริปต์ คุณสามารถดาวน์โหลด dolt binary สำหรับแพลตฟอร์มของคุณจากรีลีสล่าสุด แตกไฟล์ และวางไบนารีไว้ที่ใดที่หนึ่งบน $PATH
ของคุณ
Dolt ได้รับการบรรจุในที่เก็บข้อมูลอย่างเป็นทางการสำหรับ Arch Linux
pacman -S dolt
Dolt อยู่ใน Homebrew อัปเดตทุกเวอร์ชัน
brew install dolt
บน macOS นั้น Dolt ยังสามารถติดตั้งผ่านพอร์ตที่จัดการโดยชุมชนผ่าน MacPorts:
ติดตั้งพอร์ต sudo dolt
ดาวน์โหลด Microsoft Installer (ไฟล์ .msi
) ล่าสุดในรุ่นต่างๆ และเปิดใช้งาน
สำหรับข้อมูลเกี่ยวกับการทำงานบน Windows โปรดดูที่นี่
คุณสามารถติดตั้ง dolt
โดยใช้ Chocolatey:
choco ติดตั้ง dolt
มีอิมเมจ Docker อย่างเป็นทางการสำหรับ Dolt ดังต่อไปนี้:
dolthub/dolt
สำหรับการรัน Dolt เป็นเครื่องมือ CLI
dolthub/dolt-sql-server
สำหรับการรัน Dolt ในโหมดเซิร์ฟเวอร์
ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Go แล้ว และ go
นั้นอยู่ในเส้นทางของคุณ Dolt มีการพึ่งพา cgo ดังนั้นคุณจะต้องมีคอมไพเลอร์ C และ toolchain ที่ใช้งานได้เช่นกัน
โคลนที่เก็บนี้และซีดีลงในไดเร็กทอรี 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
% ซีดี ~% mkdir ดอท % ซีดีดอลต์
ฐานข้อมูลใดๆ ที่คุณสร้างจะถูกจัดเก็บไว้ในไดเร็กทอรีนี้ สำหรับตัวอย่างนี้ ไดเร็กทอรีชื่อ getting_started
จะถูกสร้างขึ้นที่นี่เมื่อคุณรัน create database getting_started
การนำทางไปที่ ~/dolt/getting_started
จะทำให้คุณสามารถเข้าถึงฐานข้อมูลนี้โดยใช้บรรทัดคำสั่ง Dolt
หมายเหตุ: สำหรับตัวอย่างนี้ ไดเร็กทอรี getting_started
จะถูกสร้างขึ้นหลังจากที่คุณรัน create database getting_started;
ในเชลล์ SQL ในส่วนสร้างสคีมา อย่าทำอะไรนอกจากสร้างไดเร็กทอรีและนำทางไปยังไดเร็กทอรีนั้น
Dolt มาพร้อมกับเซิร์ฟเวอร์ฐานข้อมูลที่เข้ากันได้กับ MySQL ในตัว ในการเริ่มต้นคุณต้องใช้คำสั่ง dolt sql-server
การรันคำสั่งนี้จะเริ่มต้นเซิร์ฟเวอร์บนพอร์ต 3306
เซิร์ฟเวอร์ dolt sql การเริ่มต้นเซิร์ฟเวอร์ด้วย Config HP="localhost:3306"|T="28800000"|R="false"|L="info"
เทอร์มินัลของคุณก็จะค้างอยู่ที่นั่น ซึ่งหมายความว่าเซิร์ฟเวอร์กำลังทำงานอยู่ ข้อผิดพลาดใดๆ จะถูกพิมพ์ลงในเทอร์มินัลนี้ เพียงปล่อยทิ้งไว้แล้วเปิดเทอร์มินัลใหม่
ในเทอร์มินัลใหม่ ตอนนี้เราจะเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลที่ทำงานอยู่โดยใช้ไคลเอนต์ Dolt ยังมาพร้อมกับไคลเอนต์ที่รองรับ MySQL
% dolt -u root -p "" sql# ยินดีต้อนรับสู่ไคลเอนต์ Dolt MySQL # คำสั่งจะต้องสิ้นสุดด้วย ';'.# "exit" หรือ "quit" (หรือ Ctrl-D) เพื่อ exit.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 (Homebrew)
ตอนนี้ ในการเชื่อมต่อไคลเอนต์ mysql
กับ Dolt คุณจะต้องบังคับไคลเอนต์ MySQL ผ่านอินเทอร์เฟซ TCP โดยส่งผ่านโฮสต์และพอร์ต ค่าเริ่มต้นคืออินเทอร์เฟซซ็อกเก็ตที่ Dolt รองรับ แต่มีเฉพาะใน localhost
เท่านั้น ดังนั้นจึงเป็นการดีกว่าที่จะแสดงอินเทอร์เฟซ TCP ไคลเอ็นต์ MySQL ยังต้องการให้คุณระบุผู้ใช้ ในกรณีนี้ root
% mysql --host 127.0.0.1 --port 3306 -uroot ยินดีต้อนรับสู่การตรวจสอบ MySQL คำสั่งลงท้ายด้วย ; หรือ ก. รหัสการเชื่อมต่อ MySQL ของคุณคือ 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_
ดังนั้น 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 Commit ติดตามการสร้าง ดังที่เห็นในตารางระบบ dolt_log
หมายเหตุ การคอมมิต Dolt นั้นแตกต่างจากธุรกรรม SQL มาตรฐาน COMMIT
ในกรณีนี้ ฉันกำลังเรียกใช้ฐานข้อมูลโดยเปิด AUTOCOMMIT
ดังนั้นแต่ละคำสั่ง SQL จึงสร้างธุรกรรม COMMIT
โดยอัตโนมัติ หากคุณต้องการให้ระบบสร้าง Dolt commit สำหรับทุกธุรกรรม ให้ใช้ตัวแปรระบบ @@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 รองรับได้ถึงสิบสองตาราง 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
ที่ไม่ได้กำหนดขอบเขต Unscoped 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 ได้ ฉันป้อน SQL ต่อไปนี้เพื่อชำระเงินสาขา อัปเดต แทรก ลบ และในที่สุด Dolt ก็ยอมรับการเปลี่ยนแปลงของฉัน
โทร dolt_checkout('-b','modifications'); อัปเดตพนักงาน SET first_name='Timothy' โดยที่ first_name='Tim'; ใส่ค่าพนักงาน INTO (id, first_name, Last_name) ค่า (4, 'Daylon', 'Wilkins') ;แทรกลงในค่าของพนักงาน_teams(team_id, Employee_id) (0,4);ลบออกจาก Employee_teams โดยที่ Employee_id=0 และ team_id=1; โทร dolt_commit('-am', 'การแก้ไขสาขา');
นี่คือผลลัพธ์ใน Tableplus
เมื่อกลับมาที่ Terminal ของฉัน ฉันไม่เห็นการแก้ไขตารางที่ทำใน 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)
ฉันสามารถสืบค้นสาขาได้ไม่ว่าฉันจะเช็คเอาท์อะไรโดยใช้ SQL as of
รูปแบบไวยากรณ์ก็ตาม
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)
อย่างที่คุณเห็น คุณมีพลังเต็มรูปแบบของสาขาสไตล์ Git และแตกต่างในฐานข้อมูล SQL ด้วย Dolt
ฉันยังสามารถเปลี่ยนแปลงสคีมาในสาขาเพื่อการทดสอบสคีมาใหม่แบบแยกส่วนได้ ฉันจะเพิ่มคอลัมน์ 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)
การเปลี่ยนแปลงข้อมูลสำเร็จเช่นกัน อย่างที่คุณเห็น ตอนนี้ฉันคือ "ทิโมธี" แทนที่จะเป็น "ทิม" มีการเพิ่ม 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_
เพื่อสำรวจฟีเจอร์ Lineage ใน 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 แล้ว คุณยังสามารถอ่านเกี่ยวกับสิ่งที่เรากำลังดำเนินการได้ในบล็อกของเรา