1. ホーム
  2. python

[解決済み】Sqlite3, OperationalError: unable to open database file.

2022-02-02 08:41:33

質問

質問です。データベースを開くことができないのですが?


情報: 私は、プロジェクトで sqlite3 データベースを使用します。私はテストプログラムを書いて、それを実行してデータベースに渡しました。

/tmp/cer/could.db

ユニットテストプログラムでは db 問題なく使用できます。しかし、実際に同じ場所を渡してプログラムを使用すると、以下のエラーが発生します。

OperationalError: データベースファイルを開くことができません。

でやってみました。

1) an empty database.
2) the database and the unit test left behind.
3) no database at all.

3件で、上記のようなエラーが発生しました。最もイライラさせられるのは unittest はうまくできるのに、実際のプログラムではできない。

一体何が起こっているのか、何か手がかりはないでしょうか?

解決方法は?

一次診断。SQLiteが何らかの理由でそのファイルを開くことができません。

明らかな理由を確認し、私が確認を推奨するおおよその順序で確認します。

  • そのプログラムは、テストしているのと同じマシンで動作していますか?
  • あなた(または、少なくともあなたがテストしているのと同じユーザー)として実行されていますか?
  • ディスクには /tmp がいっぱいになったか? df /tmp を使えばわかります)。
  • を使用していますか? /tmp/cer ディレクトリのパーミッションが「変」になっていませんか?(SQLiteはコミットログなどを処理するために、その中に追加のファイルを作成できる必要があります)。
  • ユニットテストのコードはまだそのデータベースを使用していますか?(コンカレント・オープン 最新のSQLiteで、適切なファイルシステムであれば可能です。 /tmp は事実上常に正しい種類のFS上にあるので、おそらくそうではないのでしょうが、それでもお勧めはできません)。
  • 開発コードは 本当に そのデータベースに書き込もうとしているのか、それとも何か「賢い」ものがあって、他のものを開こうとしているのか?(私は過去に自分のコードでこれに引っかかったことがあります。あなたには起こりえないと思わないでください...)
  • ユニットテストと本番コードで、同じバージョンの SQLite ライブラリを使用していますか?

同じマシンでない場合、本番システムに /tmp/cer ディレクトリを作成します。まずそれを修正するのは当然です。同様に、同じマシンで異なるユーザーとして実行している場合、パーミッションや所有権の問題がある可能性が高いです。ディスクの空き容量も深刻な問題ですが、可能性は低いでしょう。最後の3つが原因であるとは思いませんが、より明白なデプロイの問題が解決されたなら、チェックする価値はあります。もし上記のどれでもないのなら、あなたは異国の問題にぶち当たり、もっと多くの情報を報告しなければならないでしょう(SQLiteのバグかもしれませんが、その開発者を知っているので、それはかなりあり得ないと信じています)。