programing

일부 SQLite3 테이블의 데이터를 덤프하려면 어떻게 해야 합니까?

lovejava 2023. 8. 17. 20:31

일부 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 데이터베이스에 다시 삽입할 수 있는 SQL 파일을 가져오려면 다음과 같이 하십시오.

.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;

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

최선의 방법은 아니지만 적어도 외부 도구는 필요하지 않습니다(어쨌든 *nix box에서 표준으로 제공되는 grep 제외).

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

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

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

를 하여 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 

기타 가능한 솔루션 검토

INSERT만 포함

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

구현하기 쉽지만 새 행이 포함된 열이 있으면 실패합니다.

SQLite 삽입 모드

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

이 솔루션은 사용자 지정이 가능하지만 열에 공간 사이트에서 'Geometry' 유형과 같은 블롭 개체가 있는 경우에는 작동하지 않습니다.

스키마를 사용하여 덤프 디프

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

왜 그런지는 모르겠지만, 저에게는 효과가 없습니다.

가능한 또 다른 (새로운) 솔루션

아마도 이 질문에 대한 최선의 답은 없을 것입니다. 하지만 저에게 효과적인 것은 다음과 같은 표현을 사용하는 열 값의 새 행을 고려한 삽입물을 grep하는 것입니다.

grep -Pzo "(?s)^INSERT.*\);[ \t]*$"

하려면 덤프를 합니다..dump테이블 이름과 일치하는 LIKE 인수를 허용하지만, 이것으로 충분하지 않다면 간단한 스크립트가 더 나은 옵션입니다.

TABLES='table1 table2 table3'

echo '' > /tmp/backup.sql
for t in $TABLES ; do
    echo -e ".dump ${t}" | sqlite3 database.db3 | grep -Pzo "(?s)^INSERT.*?\);$" >> /tmp/backup.sql
done

또는 외국 키를 존중하고 모든 덤프를 한 번의 트랜잭션으로 캡슐화하기 위해 더 정교한 것.

TABLES='table1 table2 table3'

echo 'BEGIN TRANSACTION;' > /tmp/backup.sql
echo '' >> /tmp/backup.sql
for t in $TABLES ; do
    echo -e ".dump ${t}" | sqlite3 $1 | grep -Pzo "(?s)^INSERT.*?\);$" | grep -v -e 'PRAGMA foreign_keys=OFF;' -e 'BEGIN TRANSACTION;' -e 'COMMIT;' >> /tmp/backup.sql
done

echo '' >> /tmp/backup.sql
echo 'COMMIT;' >> /tmp/backup.sql

다음과 같은 경우 grep 식을 사용할 수 없음을 고려합니다.);는 열 중 문자열입니다.

테이블이 이미 작성된 데이터베이스에서 복원하려면 다음과 같이 하십시오.

sqlite3 -bail database.db3 < /tmp/backup.sql

SQLite용 명령줄 셸에 대한 SQLite 설명서에 따르면 "mode"를 "csv"로 설정한 다음 쿼리를 실행하여 원하는 테이블 행을 추출하기만 하면 SQLite 테이블(또는 테이블의 일부)을 CSV로 내보낼 수 있습니다.

sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit

그런 다음 ".import" 명령을 사용하여 CSV(쉼표로 구분된 값) 데이터를 SQLite 테이블로 가져옵니다.

sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit

(1) 표 "tab1"이 이전에 존재하지 않으며 (2) 표 "tab1"이 이미 존재한다는 두 가지 경우에 대한 추가 문서를 읽어 주십시오.

가장 좋은 방법은 스키마 부분을 제외하고 sqlite3 db 덤프가 수행할 코드를 가져오는 것입니다.

유사 코드 예제:

SELECT 'INSERT INTO ' || tableName || ' VALUES( ' || 
  {for each value} ' quote(' || value || ')'     (+ commas until final)
|| ')' FROM 'tableName' ORDER BY rowid DESC

src/shell.c:8389의 경우) 코드(sqlite-3.5.9의 경우)에 파일입니다.

셸을 꺼내서 스키마 부분을 주석 처리하고 사용할 수도 있습니다.

이 버전은 삽입물 내부의 새 줄에서 잘 작동합니다.

sqlite3 database.sqlite3 .dump | grep -v '^CREATE'

는 실로는다로시음작모하라제로 시작하는 합니다.CREATE 줄을 포함할 새 줄 포 적 이 니 습 다 성 가

역추적에 의한 답변이 가장 가까운 답변이어야 하지만, 저의 경우에는 효과가 없습니다.하나의 삽입 쿼리가 중간에 중단되어 내보내기가 중지되었습니다.이유가 무엇인지 잘 모르겠습니다.그러나 다음 시간 동안에는 정상적으로 작동합니다..dump.

▁for▁sql▁tool▁the▁the에서 생성된 SQL을 분할하기 위한 도구를 작성했습니다..dump:

https://github.com/motherapp/sqlite_sql_parser/

테이블에서 각 필드 뒤에 쉼표를 삽입하여 CSV를 생성하거나 GUI 도구를 사용하여 모든 데이터를 반환하고 CSV에 저장할 수 있습니다.

언급URL : https://stackoverflow.com/questions/75675/how-do-i-dump-the-data-of-some-sqlite3-tables