2017-10-02 2 views
0

매우 큰 데이터베이스가 있고 테스트 실행을 수행하기 위해 공동 작업중인 사람에게 해당 데이터베이스 (1/1000)의 일부를 보내려고합니다. 어떻게하면 (a) 전체 행의 1/1000을 선택하고 (b) 선택을 새로운 .db 파일로 저장할 수 있습니까?Python을 사용하여 sqlite 데이터베이스의 일부를 선택하는 방법

이것은 현재 코드이지만, 막혔습니다.

import sqlite3 
import json 
from pprint import pprint 

conn = sqlite3.connect('C:/data/responses.db')  
c = conn.cursor() 
c.execute("SELECT * FROM responses;") 
+0

하나의 옵션은 데이터베이스 파일을 복사하여 열어 999 분의 1000 데이터를 삭제 한 다음 공동 작업자에게 보냅니다. 예 : DELETE FROM responses from id> 100' 또는 그와 비슷한 – User

+0

감사합니다 - 이것은 새로운 파일 (responses.db-journal)을 생성하지만 원래 respond.db 파일의 크기에는 영향을 미치지 않습니다. 내가 뭔가 잘못하고 있는거야? –

+0

데이터의 1/1000을 차지하는 것이 중요합니까? – User

답변

0

원본 데이터베이스와 비슷한 테이블 구조로 다른 데이터베이스를 만듭니다. 원본 데이터베이스에서 샘플 기록과는 될 새로운 데이터베이스에이 작업을 수행하는

import sqlite3 
conn = sqlite3.connect("responses.db") 
sample_conn = sqlite3.connect("responses_sample.db") 
c = conn.cursor() 
c_sample = sample_conn.cursor() 

rows = c.execute("select no, nm from responses") 
sample_rows = [r for i, r in enumerate(rows) if i%10 == 0] # select 1/1000 rows 

# create sample table with similar structure 
c_sample.execute("create table responses(no int, nm varchar(100))") 
for r in sample_rows: 
    c_sample.execute("insert into responses (no, nm) values ({}, '{}')".format(*r)) 

c_sample.close() 
sample_conn.commit() 
sample_conn.close() 
0

간단한 방법을 삽입 :

  1. 복사 같은 사용자의 파일 시스템에서 데이터베이스 파일로 사용하면 다른 모든 파일 (예 : Ctrl 키 + 다음 Ctrl + V 창에서 http://sqlitebrowser.org/ 당신이 원하는 그러나 많은 행을 제거하려면 삭제 쿼리를 실행하는 등

  2. 그런 다음 SQLite는 편집기에서이 새 복사본을 열) responses-partial.db 또는 무언가를 만들 c는. 그런 다음 파일 메뉴에서 압축 데이터베이스를 실행하려고 할 수 있습니다. 당신은 내가 파이썬에서이 일을 귀찮게하지 않을 반복 시스템을 만들 필요가없는

  3. 닫기 SQLite는 편집기 및 확인 파일 크기가 작은

  4. 이메일 사본을

입니다. 그러나 파이썬에서 비슷한 단계를 수행 할 수도 있습니다 (필요한 경우 파일 복사, 삭제 쿼리 실행 등).

0

이 작업을 수행하는 가장 쉬운 방법은

  1. 데이터베이스 파일의 복사본을 만드는 것입니다; 파일을 줄이기 위해

    DELETE FROM responses 
    WHERE rowid NOT IN (SELECT rowid 
            FROM responses 
            ORDER BY random() 
            LIMIT (SELECT count(*)/1000 FROM responses)); 
    
  2. 실행 VACUUM : 당신이 정말로 무작위 샘플을 원한다면,

    DELETE FROM responses WHERE SomeID > 1000; 
    

    또는 :

  3. , 중 처음 몇 행을 유지하여 데이터의 999/1000 삭제 크기.