[sql] 일부 SQLite3 테이블의 데이터를 어떻게 덤프합니까?

데이터베이스의 일부 SQLite3 테이블 (모든 테이블이 아님)의 데이터는 물론 스키마가 아닌 데이터 만 덤프하는 방법은 무엇입니까? 덤프는 나중에 데이터베이스에 쉽게 다시 입력해야하며 명령 행에서 수행해야하므로 SQL 형식이어야합니다. 같은 것

sqlite3 db .dump

그러나 스키마를 덤프하지 않고 덤프 할 테이블을 선택하지 않아도됩니다.



답변

당신은 덤프 된 파일로하고 싶은 것을 말하지 않습니다.

다음을 사용하여 거의 모든 파일로 가져올 수있는 CSV 파일을 얻습니다.

.mode csv
-- use '.separator SOME_STRING' for something other than a comma.
.headers on
.out file.csv
select * from MyTable;

다른 SQLite 데이터베이스에 다시 삽입하려면 다음을 수행하십시오.

.mode insert <target_table_name>
.out file.sql
select * from MyTable;


답변

.schema 및 .dump 명령의 차이점을 얻는 것이 가능합니다. 예를 들어 grep을 사용하면 :

sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -vx -f schema.sql dump.sql > data.sql

data.sql 파일에는 다음과 같은 스키마가없는 데이터 만 포함됩니다.

BEGIN TRANSACTION;
INSERT INTO "table1" VALUES ...;
...
INSERT INTO "table2" VALUES ...;
...
COMMIT;

이것이 도움이되기를 바랍니다.


답변

최선의 방법은 아니지만 외부 도구가 필요하지 않습니다 (어쨌든 * nix 박스의 표준 인 grep 제외)

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'

그러나 찾고있는 각 테이블에 대해이 명령을 수행해야합니다.

여기에는 스키마가 포함되지 않습니다.


답변

.dump 특수 명령에 대해 하나 이상의 테이블 인수를 지정할 수 있습니다 (예 🙂 sqlite3 db ".dump 'table1' 'table2'".


답변

grep을 사용하여 CREATE줄 을 제외 하거나 출력 에서 INSERT줄을 가져 오라고 제안하는 대답 sqlite3 $DB .dump은 잘못 실패합니다. 이 CREATE TABLE명령은 한 줄에 하나의 열을 나열하므로 ( CREATE모두 제외 하지는 않음) INSERT줄의 값에 줄 바꿈이 포함될 수 있으므로 INSERT줄을 잡을 수는 없습니다 .

for t in $(sqlite3 $DB .tables); do
    echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql

sqlite3 버전 3.6.20에서 테스트되었습니다.

특정 테이블을 제외 시키려면로 필터링 $(sqlite $DB .tables | grep -v -e one -e two -e three)하거나 특정 하위 집합을 얻으려면로 대체하십시오 one two three.


답변

Paul Egan의 답변을 개선하면 다음과 같이 달성 할 수 있습니다.

sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'

–또는–

sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'

물론 경고는 grep을 설치해야한다는 것입니다.


답변

Python 또는 Java 또는 모든 고급 언어에서 .dump가 작동하지 않습니다. 변환을 직접 CSV로 코딩해야합니다. 나는 파이썬 예제를 제공합니다. 다른 예는 다음과 같습니다.

from os import path
import csv

def convert_to_csv(directory, db_name):
    conn = sqlite3.connect(path.join(directory, db_name + '.db'))
    cursor = conn.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    for table in tables:
        table = table[0]
        cursor.execute('SELECT * FROM ' + table)
        column_names = [column_name[0] for column_name in cursor.description]
        with open(path.join(directory, table + '.csv'), 'w') as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(column_names)
            while True:
                try:
                    csv_writer.writerow(cursor.fetchone())
                except csv.Error:
                    break

‘패널 데이터가있는 경우, 즉 ID가 많은 많은 개별 항목이 이것을 with look에 추가하고 요약 통계도 덤프합니다.

        if 'id' in column_names:
            with open(path.join(directory, table + '_aggregate.csv'), 'w') as csv_file:
                csv_writer = csv.writer(csv_file)
                column_names.remove('id')
                column_names.remove('round')
                sum_string = ','.join('sum(%s)' % item for item in column_names)
                cursor.execute('SELECT round, ' + sum_string +' FROM ' + table + ' GROUP BY round;')
                csv_writer.writerow(['round'] + column_names)
                while True:
                    try:
                        csv_writer.writerow(cursor.fetchone())
                    except csv.Error:
                        break