質問:データベースを開けないのはなぜですか?
情報:目的は重要ではありませんが、sqlite3データベースを使用するプロジェクトに取り組んでいます。データベースを作成するための場所を実行して渡すテストプログラムを作成しました。
/tmp/cer/could.db
単体テストプログラムは、dbを問題なくすることができます。次に、実際にプログラムを使用して、同じ場所を渡します。
OperationalError:データベースファイルを開けません
空のデータベースでそれをやってみました。データベースでは、単体テストが残され、データベースはまったくありませんでした。 3つの場合すべてで、このエラーが発生します。最もイライラする部分は、単体テストでうまくできるが、実際のプログラムではできないという事実です。
一体何が起こっているのか、手がかりはありますか?
一次診断:SQLiteは何らかの理由でそのファイルを開くことができません。
明らかな理由を確認し、おおよその順序で確認することをお勧めします:
/tmp
を含むディスクはいっぱいですか? (Unixを使用しているため、df /tmp
を使用して確認してください。)/tmp/cer
ディレクトリには「奇数」権限がありますか? (SQLiteは、コミットログなどを処理するために、追加のファイルを作成できる必要があります。)/tmp
は実質的に常に正しいFS soおそらくそうではありませんが、それでもお勧めできません。)同じマシンを使用していない場合、実動システムに/tmp/cer
ディレクトリがない可能性があります。最初にそれを修正するのは明らかです。同様に、同じマシン上で別のユーザーとして実行している場合、パーミッション/所有権の問題が発生する可能性があります。ディスクスペースもまた重大な落とし穴ですが、可能性は低いです。最後の3つとは思いませんが、より明らかな展開の問題が整理されているかどうかを確認する価値があります。上記のいずれでもない場合は、エキゾチックな問題にぶつかり、さらに多くの情報を報告する必要があります(SQLiteのバグでさえあるかもしれませんが、その開発者を知っているとは考えにくいでしょう)。
これは私のために働いた:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
注:フルパス内の二重スラッシュ
Win 7 EnterpriseおよびWin Xp Proでpython v2.7を使用する
これが誰かを助けることを願っています。
UNIXでは、ユーザーディレクトリに~
ショートカットを使用するとエラーが発生しました。 /home/user
に変更すると、エラーが解決しました。
理由の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')
Windows 7でも同じ問題に直面しました。データベース名はtest
で、エラーが発生しました。
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
test
をtest.db
に置き換えたところ、すべてスムーズになりました。
Syncdbの実行中にsettings.pyファイルを編集していないことを確認してください。同じエラーが発生します!!!
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
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)
明確にされなかった場合、より明確なフルパスのために
データベースに正しくアクセスできるようになった後(設定が変更されていない場合)、これがランダムに発生する場合は、破損したデータベースの結果である可能性があります。
同時に2つのプロセスからデータベースに書き込もうとしたの後にこのエラーが発生し、db.sqlite3ファイルが破損しているはずです。
私の解決策は破損が発生する前に以前のコミットに戻す
データベースファイルの完全に分類された名前を使用する
使用-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite
代わりに
私の場合、解決策は絶対パスを使用して既存のファイルを見つけることでした。
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ビット)で問題を再現できなかったため、この修正が機能する理由はわかりません。
これは間違いなく権限の問題です。 Linuxで誰かがこのエラーを受け取っている場合は、Sudo
を使用してコマンドを実行していることを確認してください。ファイルはルートが所有している可能性が高いためです。お役に立てば幸いです!
あなたがする必要がある唯一のことは、フォルダがまだ存在していないので、フォルダファイルを作成することです。データベースファイルだけがプログラムによって作成されます。これは本当にうまくいきました!
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)宛先フォルダーの許可と所有権を確認してください
それは私のために働いた、