2011-01-09 24 views
37
を開くことができません

質問:なぜ私がいないデータベースを開くことができますか?sqlite3の、OperationalError:データベースファイル


Info:私は目的が重要ではないが、sqlite3データベースを使用するプロジェクトに取り組んでいます。

/tmp/cer/could.db

とユニット・テスト・プログラムは、DB問題なく行うことができます:私は、データベースを作成する場所を実行し、それに渡すテストプログラムを作りました。私はそれに同じ場所を渡して、プログラムを使用して、実際に行くと、それは私が空のデータベースでそれをやってみました

OperationalError: unable to open database file

言います。データベースには単体テストが残っており、データベースは全くありません。すべての3つのケースで私はこのエラーが発生します。最も不満な部分は、単体テストではうまくいくが、実際のプログラムではできないという事実でなければならない。

何が起こっている地球上のような任意の手がかり?

+0

それは完全なパスですか?環境変数や '〜'やその他の短い形式でパスを渡していないのでしょうか? – chrisaycock

+0

/tmp/cer /ディレクトリは存在しますか? – thkala

+0

@chrisaycook:はい。私はそうではありません。 @スカルラ:そうです。 – Narcolapser

答えて

47

一次診断:SQLiteのは、何らかの理由でそのファイルを開くことができません。私はチェックをお勧めしますことを、なぜ、そしておおよその順に明白な理由のチェック

:あなたはそれをテストしているよう

  • は同じマシン上で実行されるプログラムですか?
  • あなた(または少なくともあなたがテストしているのと同じユーザー)として実行していますか?
  • /tmpを含むディスクがいっぱいですか? (Unix上にいるので、df /tmpを使って調べてください。)
  • /tmp/cerディレクトリに「奇妙な」パーミッションがありますか? (SQLiteはコミットログのようなものを処理するために、それに追加のファイルを作成できるようにする必要があります。)
  • ユニットテストコードはまだそのデータベースを使用していますか? (ですが現代的なSQLiteと正しいファイルシステムでは可能です - /tmpは実際には常に正しい種類のFSなので、それはおそらくそうではありません - しかしそれでも推奨されません)
  • 開発はコード実際にはそのデータベースに書き込もうとしていますか、あなたをキャッチして何か他のものを開こうとしている "賢い"ものですか? (私はこれまでに私のコードでこれまでに取り上げられてきましたが、それはあなたには起こり得ないとは思わない)...
  • ユニットテストとプロダクションコードで同じバージョンのSQLiteライブラリを使用していますか?

同じマシンにいない場合は、本番システムに/tmp/cerディレクトリがない可能性があります。それを最初に修正することは明らかです。同様に、同じマシン上にあるが、異なるユーザーとして実行している場合、権限/所有権の問題が発生する可能性があります。ディスク容量は別の深刻な問題ですが、あまりありません。私はそれが最後の3つだとは思わないが、より明らかな配備の問題が分類されているかどうかチェックする価値がある。上記のいずれにも該当しない場合は、エキゾチックな問題にぶつかり、さらに多くの情報を報告する必要があります(SQLiteのバグかもしれませんが、開発者は知っています)。

+0

はい。はい。いいえ。私が知っているものではありません。そうすべきではない。いいえ。データベースは同じシステムで作成されていますが、唯一の違いはcSystem.pyの代わりにUTFile.pyが呼び出される点です。はい、私はPythonに付属のバージョンSQLiteを使用しています。 – Narcolapser

+4

が私の問題を発見しました。文字列は完全に同一ではありませんでした。私の設定ファイルのためにわずかな違いがありました。 configファイルは私のパスに改行を残していたので、開こうとしました: '/tmp/cer/\ncloud.db'そこに問題がありました。これは非常に良い答えでした。親切にありがとう! – Narcolapser

+3

ありがとう!私はこの問題を抱えていました。ファイルにそのユーザーの書き込み権限があったとしても、Webサーバーのユーザーによるディレクトリへの書き込み権限が実際に不足していました。 – arantius

1

syncdbを実行しようとしているときにsettings.pyファイルを編集していないことを確認しても、同じエラーが発生します。

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 
21

これが私の仕事:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db") 

注:ダブルプロ勝利7企業とのWin XP上のpython V2.7を使用した完全なパス

にスラッシュ

これが誰かを助けることを望みます。

+0

これを見つけるのに1時間を費やしました! – mkingsbu

1

私は私のデータベース名がtestだったと私はエラーを得たのWindows 7上で同じ問題に直面した:

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 

私はtest.dbtestを交換し、すべてがスムーズに行ってきました。

1

データベースの指定されたパスと一致しないパスでコードが実行されている可能性があります。

conn = lite.connect('folder_A/my_database.db') 

をそして、あなたはそれが、このようなエラーが発生しますfolder_Aを持っていないfolder_Aまたは他の場所内のコードを実行します。たとえば、あなたのコードでは、あなたが持っている場合。理由は、フォルダが存在しない場合、SQLiteはデータベースファイルを作成するからです。

この問題を回避するもう1つの方法は、接続コマンドをtry-exceptという式で折り返して、sqlite3.OperationalErrorが発生した場合にディレクトリを作成することです。 OSの輸入MKDIR インポートsqlite3のから

ユーザーディレクトリの~ショートカットを使用しているとき、私はそのエラーを得たUNIX上のライト

try: 
    conn = lite.connect('folder_A/my_database.db') 
except lite.OperationalError: 
    mkdir('folder_A') 
finally: 
    conn = lite.connect('folder_A/my_database.db') 
+0

ありがとう!これは私が探していたものです。さらに、 'else'はここで冗長ではありません。なぜなら、' conn'オブジェクトは常に節が起動されるたびに作成されるからです。また、 'else'節の文を' except'部分に移動し、 'finally'を' conn.close() 'で追加するのはもっと慣用的でしょうか? –

+0

ありがとうございます。 'else'部分は実際に 'finally'になるはずです。また、作成直後に接続を閉じる必要はありません。 – Kasramvd

1

として。 /home/userに変更すると、エラーが解決されました。

関連する問題