2009-10-07 5 views
6

나는 Windows Vista 시스템에서 Python 3.1.1로 작업 중입니다. SQLite3 db에 많은 수의 행을 삽입하려고합니다. 파일이 존재하고 내 프로그램이 행을 db에 제대로 삽입합니다. 그러나 삽입 프로세스의 일부 지점에서이 메시지와 함께 프로그램이 종료됩니다. sqlite3.OperationalError : 데이터베이스 파일을 열 수 없습니다.Python sqlite3 "windows에서 데이터베이스 파일을 열 수 없습니다"

그러나 사망하기 전에 데이터베이스에 제대로 추가 된 행이 여러 개 있습니다. 여기

구체적 삽입 처리하는 코드이다

idx = 0 
lst_to_ins = [] 
for addl_img in all_jpegs: 
    lst_to_ins.append((addl_img['col1'], addl_img['col2'])) 
    idx = idx + 1 
    if idx % 10 == 0: 
     logging.debug('adding rows [%s]', lst_to_ins) 
     conn.executemany(ins_sql, lst_to_ins) 
     conn.commit() 
     lst_to_ins = [] 
     logging.debug('added 10 rows [%d]', idx) 
if len(lst_to_ins) > 0: 
    conn.executemany(ins_sql, lst_to_ins) 
    conn.commit() 
    logging.debug('adding the last few rows to the db') 

이 코드가 어디서나 10 400 행에서 삽입 한 다음이 가능이다 어떻게 오류 메시지

conn.executemany(ins_sql, lst_to_ins) 
sqlite3.OperationalError: unable to open database file 

와 다이 I 일부 행을 삽입 할 수 있지만이 오류가 발생합니까?

+0

나는 꽤 매끄럽지 않아 3.1의 sqlite, 일반적으로 윈도우, 특히 비스타인지, 또는 무엇을 - 그것을 재현 할 수 없는지 여부를 알 수 없다. 문제를 재현하는 가장 간단한 방법을 게시 할 수 있습니까? 탱크! –

+0

Vista와 Python2.6/Django에서 비슷한 문제가 있습니다. 시뮬레이션하는 한 가지 방법은 Windows 탐색기를 사용하여 db 폴더로 이동 한 다음 새로 고침을 수행하는 것입니다. – luc

답변

1

SQLite에는 레코드 잠금이 없습니다. 쓰기 동안 전체 데이터베이스 파일을 잠그는 간단한 잠금 메커니즘을 사용합니다. 당신이 아직 해결하지 못한 자물쇠에 뛰어 다니고있는 것 같습니다.

SQLite 작성자는 삽입 작업을 수행하기 전에 트랜잭션을 작성한 다음 끝에 트랜잭션을 완료 할 것을 권장합니다. 이로 인해 SQLite는 삽입 요청을 대기열에 넣고 트랜잭션이 커밋 될 때 단일 파일 잠금을 사용하여 수행합니다.

SQLite의 최신 버전에서는 잠금 메커니즘이 향상되어 더 이상 전체 파일 잠금이 필요하지 않을 수 있습니다.

+0

http://docs.python.org/3.1/library/sqlite3.html#sqlite3-controlling-transactions에 대한 내용은 다음과 같습니다. 격리 수준을 사용하여 BEGIN 문을 제어 할 수 있습니다. 데이터베이스 연결은 다음과 같이 구성됩니다. conn = sqlite3.connect (db_file, isolation_level = None) 자동 커밋해야합니다. 나는 또한 기본 수준을 사용하여 시도했지만 동일한 문제가 발생합니다. executemany 문을 실행하기 전에 트랜잭션을 시작하는 데 필요한 추가 코드가 있습니까? –

0
일부 레코드가 올바르게 삽입 후 윈도우 7 (파이썬 2.6, 장고 1.1.1 및 sqllite)에 여기

같은 오류 : sqlite3.OperationalError : 이클립스에서 다른 시간을 내 스크립트를 실행하고 항상

데이터베이스 파일을 열 수 없습니다 그 오류가있어. 그러나 명령 줄에서 (PYTHONPATH 및 DJANGO_SETTINGS_MODULE을 설정 한 후) 명령 행에서 실행 했으므로 매력으로 작동했습니다 ...

그냥 2 센트!

관련 문제