web-dev-qa-db-ja.com

Sqlite3、OperationalError:データベースファイルを開けません

質問:データベースを開けないのはなぜですか?


情報:目的は重要ではありませんが、sqlite3データベースを使用するプロジェクトに取り組んでいます。データベースを作成するための場所を実行して渡すテストプログラムを作成しました。

/tmp/cer/could.db

単体テストプログラムは、dbを問題なくすることができます。次に、実際にプログラムを使用して、同じ場所を渡します。

OperationalError:データベースファイルを開けません

空のデータベースでそれをやってみました。データベースでは、単体テストが残され、データベースはまったくありませんでした。 3つの場合すべてで、このエラーが発生します。最もイライラする部分は、単体テストでうまくできるが、実際のプログラムではできないという事実です。

一体何が起こっているのか、手がかりはありますか?

48
Narcolapser

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

明らかな理由を確認し、おおよその順序で確認することをお勧めします:

  • プログラムは、テストしているマシンと同じマシンで実行されていますか?
  • それはあなた(または少なくともあなたがテストしているのと同じユーザー)として実行されていますか?
  • /tmpを含むディスクはいっぱいですか? (Unixを使用しているため、df /tmpを使用して確認してください。)
  • /tmp/cerディレクトリには「奇数」権限がありますか? (SQLiteは、コミットログなどを処理するために、追加のファイルを作成できる必要があります。)
  • 単体テストコードはまだそのデータベースを使用していますか? (同時オープンare最新の十分なSQLiteで、適切なファイルシステムにある場合— /tmpは実質的に常に正しいFS soおそらくそうではありませんが、それでもお勧めできません。)
  • 開発コードは本当にそのデータベースに書き込もうとしていますか、それとも何か「賢い」人があなたを追い出し、何か他のものを開こうとしていますか? (私は過去に私のコードでこれに気づきました;それがあなたに起こらないとは思わないでください...)
  • 単体テストと製品コードで同じバージョンのSQLiteライブラリを使用していますか?

同じマシンを使用していない場合、実動システムに/tmp/cerディレクトリがない可能性があります。最初にそれを修正するのは明らかです。同様に、同じマシン上で別のユーザーとして実行している場合、パーミッション/所有権の問題が発生する可能性があります。ディスクスペースもまた重大な落とし穴ですが、可能性は低いです。最後の3つとは思いませんが、より明らかな展開の問題が整理されているかどうかを確認する価値があります。上記のいずれでもない場合は、エキゾチックな問題にぶつかり、さらに多くの情報を報告する必要があります(SQLiteのバグでさえあるかもしれませんが、その開発者を知っているとは考えにくいでしょう)。

61
Donal Fellows

これは私のために働いた:

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

注:フルパス内の二重スラッシュ

Win 7 EnterpriseおよびWin Xp Proでpython v2.7を使用する

これが誰かを助けることを願っています。

26
jhc

UNIXでは、ユーザーディレクトリに~ショートカットを使用するとエラーが発生しました。 /home/userに変更すると、エラーが解決しました。

6
Jacquot

理由の1つは、指定されたデータベースのパスと一致しないパスでコードを実行することです。たとえば、コード内に次のものがある場合:

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

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

この問題を回避するもう1つの方法は、接続コマンドをtry-except式でラップし、sqlite3.OperationalErrorが発生した場合にディレクトリを作成することです。

os import mkdir import sqlite3 from liteから

try:
    conn = lite.connect('folder_A/my_database.db')
except lite.OperationalError:
    mkdir('folder_A')
finally:
    conn = lite.connect('folder_A/my_database.db')
2
Kasrâmvd

Windows 7でも同じ問題に直面しました。データベース名はtestで、エラーが発生しました。

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

testtest.dbに置き換えたところ、すべてスムーズになりました。

1
Fallen

Syncdbの実行中にsettings.pyファイルを編集していないことを確認してください。同じエラーが発生します!!!

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

connection = sqlite3.connect("d:\\pythonAPI\\data.db")
cursor = connection.cursor()
create_table = "CREATE TABLE users (id int, username text, password text)"
cursor.execute(create_table)


明確にされなかった場合、より明確なフルパスのために

0
Leiradk

データベースに正しくアクセスできるようになった後(設定が変更されていない場合)、これがランダムに発生する場合は、破損したデータベースの結果である可能性があります。

同時に2つのプロセスからデータベースに書き込もうとしたの後にこのエラーが発生し、db.sqlite3ファイルが破損しているはずです。

私の解決策は破損が発生する前に以前のコミットに戻す

0
crazycoder65

データベースファイルの完全に分類された名前を使用する

使用-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite

代わりに

0
ANKIT CHOPADE

私の場合、解決策は絶対パスを使用して既存のファイルを見つけることでした。

import os.path
filepath = os.path.abspath(filepath)
# Leave this out if the file doesn't exist yet
assert os.path.exists(filepath), "The file doesn't exist"
conn = sqlite3.connect(filepath)

この修正が機能する理由はわかりません。パスにはASCII文字のみが含まれ、スペースは含まれていません。それでも違いが生じました。

参考:Windows 7、Python 3.6.5(64ビット)。

別のマシン(Windows 7もPython 3.6.4 64ビット)で問題を再現できなかったため、この修正が機能する理由はわかりません。

0
pj.dewitte

これは間違いなく権限の問題です。 Linuxで誰かがこのエラーを受け取っている場合は、Sudoを使用してコマンドを実行していることを確認してください。ファイルはルートが所有している可能性が高いためです。お役に立てば幸いです!

0
tzndr

あなたがする必要がある唯一のことは、フォルダがまだ存在していないので、フォルダファイルを作成することです。データベースファイルだけがプログラムによって作成されます。これは本当にうまくいきました!

0
Shreya Bisen

1)データベースパスを確認し、settings.pyをチェックインします

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'Django.db.backends.sqlite3',
        'Host': 'localhost',
        'NAME': os.path.join(BASE_DIR, 'project.db'),
        'PASSWORD': '',
        'PORT': '',
        'USER':''

時々NAMEがありません」:os.path.join(BASE_DIR、 'project.db')、

2)宛先フォルダーの許可と所有権を確認してください

それは私のために働いた、

0