복붙노트

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

SQL

어떻게 일부 sqlite3를 테이블의 데이터를 덤프합니까?

데이터베이스 (모든 테이블)의 일부 sqlite3를 테이블에, 어떻게 데이터를 덤프 않으며, 데이터 만이 아니라 스키마? 그것이 나중에 쉽게 데이터베이스에 다시 입력해야하며, 명령 줄에서 수행해야합니다으로 덤프는 SQL 형식이어야합니다. 같은 뭔가

sqlite3 db .dump

하지만 스키마를 덤프 및 덤프 할 테이블을 선택하지 않고.

해결법

  1. ==============================

    1.당신은 당신이 덤프 파일을 수행 할 무슨 말을하지 않습니다.

    당신은 당신이 덤프 파일을 수행 할 무슨 말을하지 않습니다.

    나는 거의 모든으로 가져올 수있는 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;
    
  2. ==============================

    2.당신은 .schema 및 .dump 명령이 점점 차이를 할 수 있습니다. 그렙에 예를 들어 :

    당신은 .schema 및 .dump 명령이 점점 차이를 할 수 있습니다. 그렙에 예를 들어 :

    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;
    

    나는 이것이 당신이 도움이되기를 바랍니다.

  3. ==============================

    3.아니 가장 좋은 방법,하지만 (어쨌든 * 괜찬아 상자에 표준 그렙 제외) 외부 도구를 필요로하지 않습니다 임대에서

    아니 가장 좋은 방법,하지만 (어쨌든 * 괜찬아 상자에 표준 그렙 제외) 외부 도구를 필요로하지 않습니다 임대에서

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

    하지만 당신은 당신이 생각 찾고있는 각 테이블에 대해이 명령을 할 필요가 없습니다.

    이 스키마를 포함하지 않습니다.

  4. ==============================

    4.당신은 .dump 특별 명령에, e.g.sqlite3 dB ".dump '표' '표 2'"하나 개 이상의 테이블 인수를 지정할 수 있습니다.

    당신은 .dump 특별 명령에, e.g.sqlite3 dB ".dump '표' '표 2'"하나 개 이상의 테이블 인수를 지정할 수 있습니다.

  5. ==============================

    5.는 CREATE 라인을 제외하거나 $ DB .dump 출력이 심하게 실패합니다 sqlite3를에서 INSERT 라인을 잡아 GREP을 사용하여 제안 모든 대답. (가) TABLE 명령은 한 줄에 하나의 컬럼 목록을 CREATE (그래서 그것의 모든을받지 않습니다 CREATE 제외)와 (그냥 INSERT 라인을 잡아 수 없도록)을 INSERT 라인에 값이 포함 된 줄 바꿈을 할 수 있습니다.

    는 CREATE 라인을 제외하거나 $ DB .dump 출력이 심하게 실패합니다 sqlite3를에서 INSERT 라인을 잡아 GREP을 사용하여 제안 모든 대답. (가) TABLE 명령은 한 줄에 하나의 컬럼 목록을 CREATE (그래서 그것의 모든을받지 않습니다 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 | 그렙 -v -e 하나 -e이 -e 세), 또는 1 ~ 2 세와 그 교체 부분 집합 특정을 얻으려면.

  6. ==============================

    6.다음과 같이 폴 에간의 대답에 대한 개선으로,이 수행 할 수 있습니다 :

    다음과 같이 폴 에간의 대답에 대한 개선으로,이 수행 할 수 있습니다 :

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

    --또는--

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

    주의해야 할 점은, 물론, 당신은 GREP 설치해야한다는 것입니다.

  7. ==============================

    7.파이썬이나 자바 또는 높은 수준의 언어에서 .dump가 작동하지 않습니다. 우리는 손으로 CSV로 변환을 코딩 할 필요가있다. 나는 파이썬 예제를 제공합니다. 다른 사람들은, 예를 감상 할 수있다 :

    파이썬이나 자바 또는 높은 수준의 언어에서 .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의 많은 개별 항목은 표정으로이를 추가하고 또한 요약 통계를 덤프 :

            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 
    
  8. ==============================

    8.명령 행 쉘에 대한 SQLite는 대한 SQLite는 문서에 따르면, 당신은 단순히 "CSV"에 "모드"를 설정하여, CSV 등의 SQLite는 테이블 (또는 테이블의 일부를) 내 보낸 다음 원하는 행을 추출하는 쿼리를 실행할 수 있습니다 탁자:

    명령 행 쉘에 대한 SQLite는 대한 SQLite는 문서에 따르면, 당신은 단순히 "CSV"에 "모드"를 설정하여, CSV 등의 SQLite는 테이블 (또는 테이블의 일부를) 내 보낸 다음 원하는 행을 추출하는 쿼리를 실행할 수 있습니다 탁자:

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

    이어서 SQLite는 테이블로 임포트 CSV (쉼표로 구분 된 값)의 데이터로 ".import"명령을 사용

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

    (1) 표 "TAB1는"이전에 존재하지 않으며 (2) 표 "TAB1는"이미 존재 : 고려하는 두 경우에 대한 자세한 설명서를 읽어 보시기 바랍니다.

  9. ==============================

    9.가장 좋은 방법은 스키마 부분을 제외하고 sqlite3를 DB를 덤프 할 것 코드를 가지고하는 것입니다.

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

    예를 들어, 의사 코드 :

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

    참조 : SRC / shell.c을 : 838 실제 코드 (SQLite는-3.5.9 용)

    당신은 단지 스키마 부분 밖으로 그 쉘과 의견을 가지고 그것을 사용할 수 있습니다.

  10. ==============================

    10.삽입 만 포함

    삽입 만 포함

    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
    

    이것은 좋은 사용자 정의 솔루션입니다,하지만 열 spatialite '기하'형 같은 BLOB 객체가있는 경우는 일을하지 않습니다

    스키마와 덤프 DIFF

    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
    
  11. ==============================

    11.이 버전은 삽입 내부의 줄 바꿈 잘 작동 :

    이 버전은 삽입 내부의 줄 바꿈 잘 작동 :

    sqlite3를 database.sqlite3 .dump | 그렙 -v '^ 만들기'

    연습 제외의 모든 라인은 줄 바꿈을 포함 할 가능성이 적습니다하는 CREATE로 시작

  12. ==============================

    12.retracile로 대답은 가장 가까운 것이어야한다, 그러나 내 경우에는 작동하지 않습니다. 하나 개 삽입 쿼리는 단지 중지 중간 및 수출을 끊었다. 확실하지 이유는 무엇인가. 그러나 그것은 .dump 동안 잘 작동합니다.

    retracile로 대답은 가장 가까운 것이어야한다, 그러나 내 경우에는 작동하지 않습니다. 하나 개 삽입 쿼리는 단지 중지 중간 및 수출을 끊었다. 확실하지 이유는 무엇인가. 그러나 그것은 .dump 동안 잘 작동합니다.

    마지막으로 나는 .dump에서 생성 된 SQL까지 분할을위한 도구를 썼다 :

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

  13. ==============================

    13.당신은이 CSV를 생성, 또는 모든 데이터를 반환하고 CSV에 저장하는 GUI 도구를 사용하여 각 필드 다음에 쉼표를 삽입 테이블을 선택 할 수 있습니다.

    당신은이 CSV를 생성, 또는 모든 데이터를 반환하고 CSV에 저장하는 GUI 도구를 사용하여 각 필드 다음에 쉼표를 삽입 테이블을 선택 할 수 있습니다.

  14. from https://stackoverflow.com/questions/75675/how-do-i-dump-the-data-of-some-sqlite3-tables by cc-by-sa and MIT license