Dolt هي قاعدة بيانات SQL يمكنك تفرعها واستنساخها وتفرعها ودمجها ودفعها وسحبها تمامًا مثل مستودع Git.
اتصل بـ Dolt تمامًا مثل أي قاعدة بيانات MySQL لقراءة المخطط والبيانات أو تعديلها. يتم عرض وظيفة التحكم في الإصدار في SQL عبر جداول النظام ووظائفه وإجراءاته.
أو استخدم واجهة سطر الأوامر الشبيهة بـ Git لاستيراد ملفات CSV، أو تنفيذ تغييراتك، أو دفعها إلى جهاز التحكم عن بعد، أو دمج تغييرات زميلك في الفريق. جميع الأوامر التي تعرفها لـ Git تعمل بنفس الطريقة تمامًا مع Dolt.
ملفات إصدارات جيت. جداول إصدارات دولت. يبدو الأمر كما لو كان لدى Git و MySQL طفل.
قمنا أيضًا ببناء DoltHub، وهو مكان لمشاركة قواعد بيانات Dolt. نحن نستضيف البيانات العامة مجانًا. إذا كنت تريد استضافة نسختك الخاصة من DoltHub، فلدينا DoltLab. إذا كنت تريد منا تشغيل خادم Dolt لك، فلدينا استضافة Dolt. إذا كنت تبحث عن إصدار Postgres من Dolt، فقد قمنا ببناء DoltgreSQL. تحذير، إنه وقت مبكر لألفا. Dolt جاهز للإنتاج.
انضم إلينا على Discord لإلقاء التحية وطرح الأسئلة، أو تحقق من خريطة الطريق الخاصة بنا لمعرفة ما نقوم ببنائه بعد ذلك.
الكثير من الأشياء! Dolt هي أداة مفيدة بشكل عام ولها عدد لا يحصى من التطبيقات. ولكن إذا كنت تريد بعض الأفكار، فإليك كيفية استخدام الأشخاص لها حتى الآن.
يمكن إعداد Dolt كنسخة طبق الأصل من قاعدة بيانات MySQL أو MariaDB الحالية باستخدام النسخ المتماثل القياسي لـ MySQL binlog. كل كتابة تصبح التزام 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
ووضعه في /usr/local/bin/
، والذي من المحتمل أن يكون موجودًا على $PATH
الخاص بك.
يحتاج نص التثبيت إلى sudo لوضع dolt
في /usr/local/bin
. إذا لم تكن لديك امتيازات الجذر أو لم تكن مرتاحًا لتشغيل البرنامج النصي معهم، فيمكنك تنزيل الملف الثنائي dolt لنظامك الأساسي من أحدث إصدار، وفك ضغطه، ووضع الملف الثنائي في مكان ما على $PATH
.
تم حزم Dolt في المستودعات الرسمية لـ Arch Linux.
pacman -S dolt
Dolt موجود على Homebrew، ويتم تحديثه في كل إصدار.
brew install dolt
على نظام التشغيل macOS، يمكن أيضًا تثبيت Dolt عبر منفذ يديره المجتمع عبر MacPorts:
منفذ سودو تثبيت دولت
قم بتنزيل أحدث إصدار من Microsoft Installer (ملف .msi
) في الإصدارات وقم بتشغيله.
للحصول على معلومات حول التشغيل على نظام التشغيل Windows، راجع هنا.
يمكنك تثبيت dolt
باستخدام Chocolatey:
choco install dolt
هناك صور 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 dolt % قرص مضغوط دولت
سيتم تخزين أي قواعد بيانات تقوم بإنشائها في هذا الدليل. لذلك، في هذا المثال، سيتم إنشاء دليل باسم getting_started
هنا بمجرد تشغيل create database getting_started
. سيسمح لك الانتقال إلى ~/dolt/getting_started
بالوصول إلى قاعدة البيانات هذه باستخدام سطر أوامر Dolt.
ملاحظة: في هذا المثال، سيتم إنشاء دليل getting_started
بعد تشغيل create database getting_started;
في Shell SQL في قسم إنشاء مخطط. لا تفعل أي شيء باستثناء إنشاء الدليل والانتقال إليه الآن.
يأتي Dolt مزودًا بخادم قاعدة بيانات متوافق مع MySQL. لبدء تشغيله، استخدم الأمر dolt sql-server
. يؤدي تشغيل هذا الأمر إلى تشغيل الخادم على المنفذ 3306.
دولت SQL الخادم بدء تشغيل الخادم باستخدام Config 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 --version MySQL Ver 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-فيتيس حقوق الطبع والنشر (ج) 2000، 2022 محفوظة لشركة Oracle و/أو الشركات التابعة لها. Oracle هي علامة تجارية مسجلة لشركة Oracle Corporation و/أو شركتها الشركات التابعة. قد تكون الأسماء الأخرى علامات تجارية خاصة بكل منها أصحاب. اكتب "مساعدة"؛ أو "h" للمساعدة. اكتب "c" لمسح بيان الإدخال الحالي. الخلية>
مرة أخرى، للتأكد من أن العميل متصل بالفعل، يجب أن ترى ما يلي في محطة 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
s. مرة أخرى، 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 بتنفيذ تغييراتي.
اتصل بـ dolt_checkout('-b','modifications'); قم بتحديث الموظفين SET first_name='Timothy' حيث first_name='Tim';أدخل قيم الموظفين (المعرف، الاسم الأول، اسم العائلة) (4،'Daylon'، 'Wilkins') ؛ أدخل في قيم الموظفين_teams(team_id, member_id) (0,4); احذف من الموظفين_teams حيث الموظف_id=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)
يمكنني الاستعلام عن الفرع بغض النظر عما قمت بسحبه باستخدام 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)
تغييرات البيانات ناجحة كذلك. كما ترون، أنا الآن "تيموثي" بدلاً من "تيم"، تمت إضافة دايلون، وجميعنا لدينا تواريخ بدء باستثناء دايلون الذي تمت إضافته في فرع مختلف.
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. يمكنك أيضًا أن تقرأ عما كنا نعمل عليه في مدونتنا.