본문으로 건너뛰기

Merql

순수 PHP 3방향 데이터베이스 병합 및 열 단위 충돌 해결. Git 스타일 병합 의미를 MySQL 및 SQLite 테이블에 적용합니다.

터미널
composer require merql/merql

최신 릴리스 v0.4.1 MIT PHP 8.2+

실제 사용

병합은 저장된 스냅샷 세 개를 읽고 기록할 작업과 해결할 충돌을 반환합니다.

스냅샷 세 개 병합

두 사본이 갈라지기 전에 base 스냅샷을 만든 다음, 각 측의 스냅샷을 만드세요. 예를 들어 라이브 데이터베이스와 샌드박스 사본을 사용할 수 있습니다. ThreeWayMerge은 양쪽을 base와 비교하고 두 변경 집합을 병합합니다.

결과 탭에서 ours는 같은 행의 content을 수정했고, theirs는 title 및 status을 수정했습니다. 따라서 병합 시 충돌 없이 세 가지 수정 사항이 모두 유지됩니다.

PHP
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

echo $result->operationCount(); // resolved operations
echo $result->conflictCount();  // unresolved conflicts

3방향 병합

기준 버전, 우리 버전, 상대 버전. 줄 단위 대신 키가 있는 행과 열을 대상으로 git 방식의 3방향 병합을 수행합니다. 두 브랜치에서 추가, 업데이트, 삭제를 감지합니다.

열 단위 해결

양쪽에서 같은 행을 변경하면 merql이 열별로 비교합니다. 같은 열이 서로 다른 값으로 변경된 경우에만 충돌이 발생합니다.

선택적 셀 병합

CellMergeConfig를 ThreeWayMerge에 전달하면 TEXT 열은 Myers diff로 줄 단위 병합을 하고, JSON 열은 키별로 병합합니다. Merql 파사드와 CLI에서는 이 기능을 활성화하지 않습니다.

다중 데이터베이스

연결 어댑터와 방언 드라이버를 플러그인 방식으로 사용할 수 있으며, MySQL 및 SQLite이 기본 제공됩니다.

충돌 감지

업데이트 대 업데이트, 업데이트 대 삭제, 삭제 대 업데이트, 삽입 대 삽입 충돌을 테이블과 행 정보와 함께 각각 보고합니다. 업데이트 대 업데이트 충돌은 열 이름도 표시합니다.

SQL 생성

매개변수화된 INSERT, UPDATE, DELETE 문을 외래 키를 고려해 정렬합니다. 트랜잭션에서 미리 보기로 실행하거나 적용할 수 있습니다.

CLI

명령줄에서 스냅샷, diff, 병합을 실행합니다. 환경 변수를 통해 MySQL 및 SQLite을 지원합니다.

테스트 완료

직접 작성한 예상 결과를 사용하는 회귀 시나리오 32개(composer test:oracle). CI에서 231 단위 테스트와 통합 테스트, PHPStan 레벨 10을 실행합니다.

Merql를 사용하는 이유

스냅샷은 파일입니다

각 스냅샷은 JSON 파일 하나로, 컴퓨터 간에 복사하거나 버전 관리에 커밋할 수 있습니다. diff와 병합은 해당 파일을 읽으므로 데이터베이스에 연결하지 않고도 실행됩니다.

기록 전에 검토

병합 계획은 각 작업과 변경 그룹에 안정적인 ID를 부여하고 base, ours, theirs, 결과 행을 유지합니다. 원하는 그룹을 선택해 해당 항목만 적용하세요.

오래된 계획은 중단됩니다

Guarded Apply는 검토한 스냅샷과 여전히 일치하는 행에만 기록합니다. 문에 영향을 받은 행이 없으면 트랜잭션이 롤백되고 결과에 오류가 포함됩니다.

변경 감지 기능이 있는 롤백

기록 직전의 라이브 행을 바탕으로 롤백 계획을 만들고 JSON으로 저장합니다. 실행을 되돌리기 전에 변경 감지 검사에서 행 지문을 비교하고 그 이후 변경된 행에 해당하는 작업을 반환합니다.

비교 대상

Merql은 세 스냅샷의 행 데이터를 병합합니다. 이 도구들은 데이터베이스 버전 관리, 동기화 또는 마이그레이션을 수행하며, 이는 인접한 작업 영역입니다.

Merql와 다른 도구 비교
Dolt 잘하는 점Dolt은 포크, 복제, 브랜치 생성, 병합, 푸시, 풀을 Git 저장소처럼 할 수 있는 SQL 데이터베이스입니다. 일반 MySQL 데이터베이스처럼 연결하며 모든 셀의 계보를 추적합니다. Merql와의 차이점Merql은 이미 실행 중인 MySQL 또는 SQLite 데이터베이스를 그대로 사용합니다. 테이블을 JSON 스냅샷 파일로 저장하고, 사용자가 선택한 base 스냅샷을 포함해 세 개를 병합합니다.
pt-table-sync 잘하는 점pt-table-sync은 MySQL 테이블 간의 차이를 한 방향 또는 서버 간 양방향으로 찾아 해결합니다. 복제본을 동기화할 때는 복제 원본에 변경 사항을 적용합니다. Merql와의 차이점양방향 동기화에서 pt-table-sync은 충돌 열을 기준으로 승리할 행을 선택하고 그 값을 복사합니다. Merql은 양쪽을 공통 base와 비교하고, 같은 행의 서로 다른 열에 대한 수정을 병합하며, 호환되지 않는 변경 사항은 해결할 충돌로 보고합니다.
sqldiff 잘하는 점sqldiff는 두 SQLite 데이터베이스를 비교하고 첫 번째 데이터베이스를 두 번째 데이터베이스로 바꾸는 SQL 스크립트를 출력합니다. SQLite 세션 확장용 바이너리 변경 집합을 쓰거나 테이블별로 변경된 행을 요약할 수도 있습니다. Merql와의 차이점양방향 diff로는 한쪽에서 행을 추가했는지 다른 쪽에서 삭제했는지 알 수 없습니다. Merql은 이를 판단하도록 base 스냅샷을 추가하고, 두 변경 집합을 병합하며, MySQL에서도 작동합니다.
Doctrine Migrations 잘하는 점Doctrine Migrations는 데이터베이스 스키마의 버전을 관리하므로, 스키마 변경을 검토하고 테스트한 뒤 프로덕션에 배포할 수 있습니다. Merql와의 차이점Merql은 스키마 마이그레이션 도구가 아닙니다. 행 데이터를 병합하고 스냅샷 사이에 추가되거나 제거된 열을 보고하며, 스키마 변경은 사용자가 처리하도록 남겨 둡니다.

질문과 답변

Merql 문서의 간단한 답변.

첫 스냅샷부터 병합 계획, Guarded Apply, 롤백까지 가이드에 따라 진행하세요.