2009-10-07 34 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') 

このコードは、エラーメッセージI、それが可能である方法

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

とダイ次いで、10〜400行のどこにでも挿入しますいくつかの行を挿入できますが、このエラーが発生しますか?

+0

私はかなり不安定で、3.1のsqlite、一般的なウィンドウ、特にVistaのバグかどうかはわかりません。何か - 私はそれを再現できません。問題を再現するための最も簡単な方法を投稿できますか?タンク! –

+0

私はVistaとPython2.6/Djangoで同様の問題を抱えています。シミュレートする1​​つの方法は、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
いくつかのレコードが正しく挿入された後に、Windows 7(のpython 2.6、ジャンゴ1.1.1およびsqllite)で、ここで

同じエラー:sqlite3.OperationalError:私は、Eclipseから異なる時間を私のスクリプトを実行し、常に

データベースファイルを開くことができませんそのエラーが発生しました。しかし、私がコマンドラインから(PYTHONPATHとDJANGO_SETTINGS_MODULEを設定した後)コマンドラインから実行したとき、それは魅力として働いていました...

ちょうど私の2セント!

関連する問題