나는 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)
메모를 저장하려고합니다. 학생의 신분에 따라 다른 모든 필드를 업데이트 할 수 있습니다. 나는 잠시 포기하고있다. 너무 좌절하는 것.
ON UPDATE 트리거를 만듭니다. NEW.xx가 NULL이면 NEW.xx = OLD.xx를 설정하십시오. –
@pst 괜찮습니다. 그렇게하고 싶습니다. 나는 명시되지 않은 필드 (IE 'notes'- SQL 코드에없는)가 null로 설정되는 것을 좋아하지 않는다. AT-lc, 저것 좀 봐. –
가능한 복제본 [SQLite - UPSERT * INSERT 또는 REPLACE] (http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace) –