SQLite – 테이블을 다른 데이터베이스로 이관하기

테이블을 다른 데이터베이스 파일로 이관하는 방법은 단순하다. 새로운 DB 파일을 새 데이터베이스로 연결해서, CREATE TABLE .. AS SELECT .. 구문을 사용해서 복사한다. 다음 예제는 외부 DB 파일을 반입한 다음, 특정 테이블 하나의 내용으로 새로운 테이블을 채우는 과정을 보여준다.

ATTACH 'file-archives.db' AS other;
CREATE TABLE other.images AS SELECT * FROM main.images;
DETACH others;

CREATE TABLE ... AS ... 를 사용하는 이 방법은 사실 한가지 함정을 가지고 있다. 이 쿼리는 테이블을 복제한다기보다는 한쪽의 데이터를 다른 테이블을 만들어서 밀어넣는 역할을 수행한다. 따라서 기존 테이블의 스키마 구조를 온전하게 유지하지 못한다. 단지 SELECT 쿼리의 결과 그리드를 테이블로 단순 변환하는 것에 지나지 않는다.

만약 전체 테이블을 통째로 복제하고 싶다면? 다음의 내용을 dump-command.sql 로 저장하자.

.output some_table_backup.sql
.dump some_table
.output

이 명령은 해당 테이블을 완전히 재구성할 수 있는 sql 문을 파일로 만들어낸다.  예를 들어 원래의 DB 파일 이름이 oldies.db 라고 한다면

sqlite3 --init dump-command.sql oldies.db

를 실행하면 dump-command.sql 파일이 생성된다. 이 파일은 덤프한 시점의 테이블을 그대로 복원할 수 있는 쿼리문이 모두 저장된다. 당연히 새로운 DB 파일에서 이를 실행하면 다른 DB로 해당 데이터를 복제하게 되는 셈이다.  다음 명령을 실행하면 new.db 데이터 베이스가 생성되면서 (혹은 기존에 있던 거라면 열리면서) some_table이 생성되고 그 내용이 완전히 복원되어 있는 것을 확인할 수 있다.

sqlite3 --init some_table_backup.sql new.db