2010-01-19 6 views
47

리눅스를 사용하여 동일한 스키마를 가진 두 SQLite 데이터베이스를 비교하고 싶습니다. 몇 가지 차이점이 있습니다.리눅스에서 두 SQLite 데이터베이스를 비교하는 방법

이러한 차이점을 출력 할 수있는 도구가 있습니까? 그들을 grep/sed 할 수 있도록 명령 줄에 출력하는 것이 바람직합니다.

SQLite는 SQL을 사용하므로 일반적인 SQL 도구도 사용할 수 있습니다.

답변

39

SQLite Release 3.8.10이 2015 년 5 월 7 일에 릴리스되었습니다.이 릴리스에는 두 개의 SQLite 데이터베이스 파일 간의 차이점을 계산하기위한 sqldiff.exe utility program이 처음으로 포함되어 있습니다. 이 프로그램은 향후 릴리스의 일부가 될 가능성이 큽니다.

sqldiff.exe 명령 줄 도구는 지원되는 모든 운영 체제에서 작동하며 출력 동작을 변경하기위한 여러 스위치를 제공합니다. 사용 예제는 : 옵션을 지정하지 않으면

sqldiff [options] database1.sqlite database2.sqlite 

, 다음 sqldiff.exe의 출력은 database2.sqlite (이하 "대상"데이터베이스)에 database1.sqlite (이하 "소스"데이터베이스)를 변화시킬 SQL 문입니다.

그러나 특정 제한이 있습니다. 예를 들어 sqldiff.exe 유틸리티 (적어도 현재)는 트리거, 뷰 또는 가상 테이블의 차이점을 표시하지 않습니다.


샘플 명령 및 출력

나는 간단한 키 - 값 저장소 데이터베이스 (db1.sqlite)를 가져다가 그것 (db2.sqlite)의 사본했다. 그런 다음 하나의 키 - 값 쌍을 db2.sqlite에 삽입했습니다. 그 후 나는 다음 명령을 실행 :

sqldiff db1.sqlite db2.sqlite 

을 다음과 같은 결과를 얻었다 :

INSERT INTO my_table(rowid,"key",value) VALUES(1,'D:\Test\Test.txt',x'aabbccdd');
UPDATE my_table_size SET counter=1 WHERE rowid=1;

키 - 값 쌍은 my_table에 삽입 된 후 my_table_size가 자동 트리거에 의해 갱신 된 테이블. 나는 그 다음에 sqldiff를 돌렸다.다시 EXE하지만, 두 번째 인수로 첫 번째 인수로 db2.sqlitedb1.sqlite와이 시간 :

sqldiff db2.sqlite db1.sqlite 

하고있어 다음과 같은 출력 :

DELETE FROM my_table WHERE rowid=1;
UPDATE my_table_size SET counter=0 WHERE rowid=1;


sqldiff 다운로드가

링크

2016 년 1 월 20 일에 출시 된 SQLite version 3.10.2 이후, 그는 에 대한 32 비트 바이너리 sqldiffSQLite Download Page에서 직접 다운로드 할 수 있습니다. 해당 운영 체제의 sqlite 도구 아카이브에서 찾을 수 있습니다 (사전 컴파일 된 바이너리 섹션 참조). SQLite는 버전

이전 버전 3.10.2에 예를 들어, 여기에 SQLite는 도구에 대한 링크 버전 3.22.0의 아카이브는 , SQLite 웹 사이트는 sqldiff에 대한 32 비트 바이너리를 호스트하지만 링크하지 않습니다. download 원시에 64 비트 바이너리를해야하는 경우

는, 당신은이 : 여기에 버전 3.8.10의 sqldiff 에 대한 링크가 있습니다 소스를 수집하고 직접 컴파일하십시오. (파일 sqldiff.c는 소스를 포함하는 아카이브의 도구 하위 디렉토리에 있습니다.)

+0

좋아요! 샘플 명령과 샘플 출력을 추가 하시겠습니까? 감사! –

+1

@NicolasRaoul : 나는 더 많은 정보와 테스트 결과를 추가했다. – honk

+0

Windows 용 사전 컴파일 된 바이너리를 다운로드하면 sqlite3.exe 만 포함되어 있습니다. sqldiff.exe는 어디에서 찾을 수 있습니까? – Freek8

46

하나의 가능성은 sqlite3 명령 줄 클라이언트를 사용하여 두 데이터베이스를 모두 내 보낸 다음 출력을 diff하는 것입니다. 예 :

echo .dump | sqlite3 first.sqlite >first.dump 
echo .dump | sqlite3 second.sqlite >second.dump 
diff first.dump second.dump 
+0

차이점이 무엇인지를 추측하기는 어렵지만 처음에는하지 않겠습니다. awk 스크립트는 각 diff가 제공되는 테이블을 표시 할 수 있습니다. –

+0

또는 이것 (http://www.fmpromigrator.com/products/sqlite_diff/index.html). 참고 :이 제품은 유료 제품으로이 글을 쓰는 시점에 25 달러이며 저자와 관련이 없습니다. – Julian

+0

@ 율리안 : 흥미 롭다! 오픈 소스가 아니라는 것이 나쁘지 만, 어쨌든 내 질문에는 요구 사항이 아니기 때문에 자유롭게 대답하자. –

3

시도 SQLite Diff입니다.

참고 :이 글은이 글을 쓰는 시점에서 25 달러의 유료 제품이며 저자는 이 아니며이 아닙니다.

+0

이것은 인라인 기본'sqldiff'와 어떻게 다른가요? – Pacerier

9

그것은 Windows 용이지만 Code Project에는 무료/오픈 소스 SQLite 데이터베이스 비교 응용 프로그램이 있습니다. http://www.codeproject.com/Articles/220018/SQLite-Compare-Utility은 나를 위해 잘 작동합니다.

+0

안드로이드에서 가져온 sqlite datadases에 대한이 작업이 없습니다 – arnab321

+1

인벤토리 기본 'sqldiff'와 어떻게 다른가요? – Pacerier

1

2016년 1월 sqldiff (윈도우 sqldiff.exe) 20 년 이후 http://sqlite.org/download.html에서 압축 파일에 포함되어 있습니다

+1

Linux http://sqlite.org/2016/sqlite-tools-linux-x86-3100200 .zip OS X http://sqlite.org/2016/sqlite-tools-osx-x86-3100200.zip Windows http://sqlite.org/2016/sqlite-tools-win32-x86-3100200.zip –

+0

참고 release.version.update, patch (rvvuupp is 3100200)는 곧 변경 될 수 있습니다 (3.10.1에서 3.10.2까지는 일주일 만에 걸렸습니다) –

관련 문제