「データベースファイルを開けません」というsqliteエラーが表示されるのはなぜですか?


65

Djangoアプリを使用すると、データベースから問題なく読み取ることができます。アプリケーションにファイルへのアクセス許可がない場合、次のエラーが表示されました。

読み取り専用データベースを書き込もうとする

それは理にかなっています。そこで、ファイルのパーミッションを編集して、Apacheプロセスに書き込みパーミッションを付与しました。ただし、書き込みができる代わりに、この不可解なエラーが発生します。

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

便利な場合、出力全体は次のとおりです。

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500

スタックトレースが必要かどうかを教えてください。


デプロイ時にこの問題が発生したと考えられます。
モハメッドシェアリーフC

回答:


79

ああ、これを説明する記事に出くわしまし。DjangoのNewbieMistakesページにも情報があります。

解決策は、データベースファイルを含むディレクトリにもプロセスへの書き込みアクセスが許可されていることを確認することです。

私の場合、このコマンドを実行すると問題が修正されました。

sudo chown www-data .

3
あなたがあなたの代わりに「WWWデータ」の「アパッチ」を使用したいとしているCentOSのを使用している場合、これは、あなたは、debian / Ubuntuの上にいると仮定し
ルーク・チャドウィック

3
@nbolton注:そうでなけれchown www-data. .ば、実際にはchown www-data .そうでなければなりません。
ジェフシェフィールド14

3
余分なドットは、グループを所有者のデフォルトグループに設定することだと思います。それ以外の場合、グループは変更されません。ただし、これはメモリからのものです。自分で試してみることを強くお勧めします。
ニックボルトン

将来のリンクrotまたはtl; drの場合にここで要約します。SQLite3は、トランザクションが開かれたときにジャーナルファイルを作成できるように、DBファイルのディレクトリへの書き込みアクセスを必要とします。
user1454265

Linuxユーザーに最適です。Windows用のBupkiss。
ジェイブランチャード

7

これに対する私の解決策はもっと似ていました。このディレクトリの所有権を変更したくありませんでした。(主にgitのようなことをするためにpiユーザーを使用しているため)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db

(または使用しているデータベース)

piは、すべてのファイルを作成したユーザーです(はい、これはラズベリーpiです)。

www-dataのアクセス許可を変更する代わりに、次のようにアクセス許可を変更するだけでよいことがわかりました。

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data

これにより、必要なファイルへのグループ書き込みアクセスが許可され、www-dataユーザーがpiグループに追加されます。

注:ロギングがある場合は、djangoログファイルにも同様にこれを行う必要があります。そうしないと、apacheはあまり気に入らないでしょう。


1
piユーザーをwww-dataグループにも追加できたと思います。また、ファイルをそのままにして、コマンドsetfaclを使用して、ファイルやディレクトリにpiのアクセス制御リストを追加することもできます。
slm

setfaclは、潜在的に良いオプションのように聞こえます。これを指導的な回答としてリストしておくとよいでしょう。私が直面している問題の1つは、テスト中に.dbファイルを頻繁に削除する必要があることです。再作成されたら、再度チャニングする必要があります。
SpiRail

この質問に対する私の答え、serverfault.com / a / 462970/2518を参照してください。さらに役立つものを追加する必要がありますか?
slm

7

Django から、Newbieの間違い Django wiki ページのSQLite3 セクション使用すると、「データベースファイルを開けません」と表示されます

  1. Apacheがデータベースの親ディレクトリにも書き込むことができることを確認してください
  2. データベースファイルのフルパスのフォルダーが数字で始まっていないことを確認してください
  3. dbディレクトリの絶対パスが存在することを確認してください
  4. /tmpディレクトリが誰でも書き込み可能になっていることを確認してください
  5. で指定されたデータベースへのパスがsettings.py完全パスであることを確認してください
  6. パスに特殊文字が含まれていないことを確認してください
  7. Windowsでは、dbディレクトリパスが二重のバックスラッシュで書き込まれていることを確認してください

リンクの関連部分をここにコピーして貼り付けます。
クリストフ・デ・トロイエ

そして、それは賛成です!:)
クリストフデトロイエ

5

運用ユーザーをwww-dataグループに追加することは、テスト環境でうまく機能しています。さらに、sqlite3.dbファイルを別のサブフォルダーに入れて、より安全にしています。

データベースファイルはwww-dataが所有します。

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db

私の運用ユーザーhapeは、www-dataグループのメンバーを取得します。

sudo usermod -a -G www-data hape

グループwww-dataのメンバーへのデータベースファイル書き込みアクセスを許可します。

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db

その結果、データベースは、プロジェクトルートフォルダーに許可を与えることなく、apache2-daemon(ユーザーwww-data)によって読み取りと書き込みにアクセスできます。一方で、アプリは、ユーザーヘイプ、例えば

./manage.py runserver

また。


1

SO質問から借用:https : //stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

起動するファイルがapacheユーザーによって所有されていると仮定します:

% chown -R apache.apache /var/www/mysite

ACLsユーザー/グループpiに設定:

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x

あなたはあります伝えることができるACLとともにls -l、パーミッションビットに「+」末尾は:

# ls -la /var/www
drwxr-xr-x   3 apache   apache   80 26. Nov 12:43 .
drwxrwxrwt  15 root     root 360 26. Nov 12:40 ..
drwxrwxr-x+  2 apache   apache   40 26. Nov 12:43 mysite

djangoプロジェクト全体のオーナー/グループをApacheプロセスに設定するのは悪い考えであり、不要な権限を与える必要はありません。
ベンジャオミング

1

解決策は、データベースファイルを含むディレクトリにもプロセスへの書き込みアクセスが許可されていることを確認することです。

以下のためのWindowsなど7、8.1、10、Server 2012の、続くボノボの設置方向を

IISユーザーがC:\ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Dataフォルダーを変更できるようにします。

そうするために:

  1. App_Dataフォルダーのプロパティを選択し、
  2. [セキュリティ]タブに移動し、
  3. 編集をクリックし、
  4. IISユーザー(私の場合はIIS_IUSRS)を選択し、変更および書き込み権限を追加します。
  5. [適用]ボタンでこれらの設定を確認します。

0

開発サーバーは、データベースフォルダーに書き込み権限を持つ同じユーザーとして実行する必要があるため、最初にデータベースをルートとして作成した場合は、実行時にルートである必要があります。

python manage.py runserver

技術的には正しいものの、サーバーをそのまま実行するのrootひどい考えです- chown通常はサーバーを実行する通常の非特権ユーザーにとってはデータベースの方が良いでしょう
...- voretaq7

0

作業ディレクトリにサブディレクトリを作成します

mkdir db-folder 

サブディレクトリにsqliteデータベースを作成します

sqlite3 db-folder/db.db

サブディレクトリの所有者をdebainのwww-dataまたはcentOSのapacheに変更します

chown -R www-data db-folder

冷たいビールを手に入れてください。

P / S:手順が成功したかどうかを確認します

ls -l data-folder

あなたはそのように見えるはずです

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder

回答を投稿する場合は、同じ質問の他の回答とは大幅に異なる回答を入力してください。
マセガロー14年

-1

書くだけでsudo sqlite3 databaseFilename.sqlうまくいく


これは、対話型ユーザーセッションでは機能する可能性がありますが、Webアプリケーションではなくソリューションではありません
...-HBruijn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.