2012-08-31 3 views
0

나는 2 년 동안 사용해온 성적표를 가지고 있습니다. 동료가 사용하기를 원하기 때문에 조금 정리하려고하지만 실제로는 준비가되지 않았으며 개인적으로 준비가되어 있습니다. 어쨌든, 나는 학생 목록 업데이트를 자동화하려고 노력했다. 나는 다음과 같은 시도 :sqlite3 INSERT OR REPLACE 필드를 덮어 쓰시겠습니까?

import csv 
import sqlite3 
f = csv.reader(open('students.csv')) 

db = sqlite3.connect('gradebook.db') 
cursor = db.cursor() 

for row in f: 
    print row 
    cursor.execute('INSERT OR REPLACE INTO students (id, name, class, gender, birthday, something, period, section_number, subject, begin_date, end_date, status, absents, tardies) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)', row) 

db.commit() 
db.close() 

이 새로운 학생들을 위해 작동하지만, 나는 또한 학교 (노트, 현재 장 등)에서 덤프 CSV에 의해 참조되지 않는 내 데이터베이스에서 몇 가지 열이 있습니다. 위의 코드를 실행하면 참조되지 않은 열에있는 모든 항목이 NULL로 설정됩니다. 실행 명령에서 참조되지 않는 열을 보존하는 방법이 있습니까?

EDIT : 여러 가지를 시도해 보았습니다. 무능력으로 아무 것도 효과가 없었습니다. 루프에서 다음과 같이 끝나면 오류가 발생했습니다.

cursor.execute('INSERT OR REPLACE INTO students (notes, id, name, class, gender, 
    birthday, something, period, section_number, subject, begin_date, end_date, 
    status, absents, tardies) VALUES ((select notes from students where id = 
    row[0]),?,?,?,?,?,?,?,?,?,?,?,?,?,?)', row) 

메모를 저장하려고합니다. 학생의 신분에 따라 다른 모든 필드를 업데이트 할 수 있습니다. 나는 잠시 포기하고있다. 너무 좌절하는 것.

+1

ON UPDATE 트리거를 만듭니다. NEW.xx가 NULL이면 NEW.xx = OLD.xx를 설정하십시오. –

+0

@pst 괜찮습니다. 그렇게하고 싶습니다. 나는 명시되지 않은 필드 (IE 'notes'- SQL 코드에없는)가 null로 설정되는 것을 좋아하지 않는다. AT-lc, 저것 좀 봐. –

+0

가능한 복제본 [SQLite - UPSERT * INSERT 또는 REPLACE] (http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace) –

답변

0

글쎄, 삽입 또는 교체 형식을 알아낼 수 없었습니다. 최대 실행 및 UPDATE 쿼리와 INSERT (기본 키의 오류 잡기)가 종료되었습니다. 내가하고있는 일을 위해 일한다. 우아한 방법이 있어야하는 것처럼 보입니다. UPSERT. 도대체 무엇이.

관련 문제