Warum erhalte ich den SQLite-Fehler "Datenbankdatei kann nicht geöffnet werden"?

65

Mit meiner Django-App kann ich problemlos aus der Datenbank lesen. Wenn die Anwendung keine Berechtigung zum Zugriff auf die Datei hatte, gab es mir diesen Fehler:

Versuchen Sie, eine schreibgeschützte Datenbank zu schreiben

Was Sinn machte. Daher habe ich die Berechtigungen für die Datei bearbeitet, sodass der Apache-Prozess über Schreibberechtigungen verfügt. Anstatt jedoch schreiben zu können, erhalte ich diesen kryptischen Fehler:

Datenbankdatei kann nicht geöffnet werden

Wenn es nützlich ist, hier ist die gesamte Ausgabe:

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

Lassen Sie mich wissen, ob ein Stack-Trace erforderlich ist.

Nick Bolton
quelle
Es wird vermutet, dass Sie dieses Problem bei der Bereitstellung hatten.
Mohammed Shareef C

Antworten:

79

Aha, bin gerade auf einen Artikel gestoßen, der das erklärt. Auch Django hat Infos auf ihrer NewbieMistakes- Seite.

Die Lösung besteht darin, sicherzustellen, dass das Verzeichnis, das die Datenbankdatei enthält, auch Schreibzugriff auf den Prozess hat.

In meinem Fall hat das Ausführen dieses Befehls das Problem behoben:

sudo chown www-data .
Nick Bolton
quelle
3
Dies setzt voraus, dass Sie unter debian / ubuntu arbeiten. Wenn Sie CentOS verwenden, möchten Sie 'apache' anstelle von 'www-data' verwenden
Luke Chadwick
3
@nbolton Hinweis: Sollte chown www-data. .eigentlich etwas chown www-data .anderes sein, gibt es einen Zauberer des Befehls chown, von dem ich nichts weiß ... bitte klären Sie mich auf.
Jeff Sheffield
3
Ich glaube, der zusätzliche Punkt besteht darin, die Gruppe auf die Standardgruppe des Besitzers zu setzen. Ansonsten ändert sich die Gruppe nicht. Dies ist jedoch nur aus dem Gedächtnis, ich empfehle dringend, dass Sie das selbst ausprobieren.
Nick Bolton
Hier zusammengefasst für den Fall eines zukünftigen Links rot oder tl; dr: SQLite3 möchte Schreibzugriff auf das Verzeichnis der DB-Datei haben, damit es dort eine Journaldatei erstellen kann, wenn eine Transaktion geöffnet wird.
user1454265
Ideal für Linux-Benutzer. Bupkiss für Windows.
Jay Blanchard
7

Meine Lösung dafür war eher so. Ich wollte den Besitzer dieses Verzeichnisses nicht wirklich ändern. (hauptsächlich, weil ich den pi-Benutzer benutze, um Dinge wie git zu tun)

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

(oder was auch immer du verwendest)

Wobei pi der Benutzer ist, in dem ich alle Dateien erstellt habe. (Ja, dies ist ein Himbeer-pi.)

Anstatt die Berechtigungen für www-data zu ändern, musste ich nur die folgenden Berechtigungen ändern:

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

Dies gibt der Gruppe Schreibzugriff auf die erforderlichen Dateien und fügt den Benutzer www-data der pi-Gruppe hinzu.

Hinweis: Wenn Sie sich angemeldet haben, müssen Sie dies auch für die Django-Protokolldatei tun, da es Apache nicht gefällt.

SpiRail
quelle
1
Ich glaube, Sie hätten den pi-Benutzer auch einfach der www-Datengruppe hinzufügen können. Sie hätten die Dateien auch einfach so belassen können, wie sie sind, und den Befehl setfacl verwendet, um eine Zugriffssteuerungsliste für pi für die Dateien und / oder Verzeichnisse hinzuzufügen.
Slm
setfacl klingt nach einer potenziell guten Option. Es wäre gut, wenn dies als Anleitungsantwort aufgeführt würde. Ein Problem, dem ich gegenüberstehe, ist, dass ich die .db-Datei häufig beim Testen löschen muss. Wenn es neu erstellt wird, muss es erneut verschluckt werden.
SpiRail
Siehe meine Antwort auf diese Frage unter serverfault.com/a/462970/2518 . Gibt es etwas mehr, das ich dem hinzufügen sollte, was helfen würde?
Slm
7

Im Django steht "Datenbankdatei kann nicht geöffnet werden", wenn der SQLite3- Abschnitt der Django-Wiki- Seite " Newbie mistakes" verwendet wird :

  1. Stellen Sie sicher, dass Apache auch in das übergeordnete Verzeichnis der Datenbank schreiben kann
  2. Stellen Sie sicher, dass keiner der Ordner im vollständigen Pfad der Datenbankdatei mit einer Zahl beginnt
  3. Stellen Sie sicher, dass der vollständige Pfad des dbVerzeichnisses vorhanden ist
  4. Stellen Sie sicher, dass Ihr /tmpVerzeichnis schreibgeschützt ist
  5. Stellen Sie sicher, dass der in angegebene Pfad zur Datenbank settings.pyein vollständiger Pfad ist
  6. Stellen Sie sicher, dass der Pfad keine Sonderzeichen enthält
  7. Stellen Sie unter Windows sicher, dass der Datenbankverzeichnispfad mit doppelten Backlashes geschrieben ist
ssc
quelle
Kopieren Sie die relevanten Teile des Links und fügen Sie sie hier ein.
Christophe De Troyer
Und es ist eine Aufwertung! :)
Christophe De Troyer
5

Das Hinzufügen eines operativen Benutzers zur WWW-Datengruppe funktioniert in meiner Testumgebung gut. Außerdem habe ich die Datei sqlite3.db in einem separaten Unterordner abgelegt, um die Sicherheit zu erhöhen .

Die Datenbankdatei gehört www-data

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

Mein operativer Benutzer hape wird Mitglied der WWW-Datengruppe:

sudo usermod -a -G www-data hape

Ermöglichen Sie den Schreibzugriff auf Datenbankdateien für Mitglieder der Gruppe 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

Infolgedessen kann apache2-daemon (Benutzer www-data) lesend und schreibend auf die Datenbank zugreifen, ohne dem Projektstammordner eine Berechtigung zu erteilen, und andererseits kann die App vom Benutzer im dev-Modus ausgeführt werden Benutzer hape, z

./manage.py runserver

ebenfalls.

Hartmut P.
quelle
1

Ausgeliehen von SO-Frage: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Vorausgesetzt, die Dateien gehören dem Apache-Benutzer, um zu starten:

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

Set ACLsfür Benutzer / Gruppe 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

Sie können feststellen, dass die Berechtigungsbits ACLmit ls -leinem abschließenden '+' versehen sind:

# 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
slm
quelle
Das Einstellen des Besitzers / der Gruppe auf den Apache-Prozess für das gesamte Django-Projekt ist eine schlechte Idee, da keine unnötigen Berechtigungen vergeben werden müssen.
Benjaoming
1

Die Lösung besteht darin, sicherzustellen, dass das Verzeichnis, das die Datenbankdatei enthält, auch Schreibzugriff auf den Prozess hat.

Befolgen Sie für Windows 7, 8.1, 10, Server 2012 usw. die Bonobo-Installationsanweisungen :

IIS-Benutzer darf den Ordner C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data ändern.

Um dies zu tun:

  1. Wählen Sie Eigenschaften des Ordners App_Data.
  2. Gehen Sie zur Registerkarte Sicherheit,
  3. Klicken Sie auf Bearbeiten.
  4. Wählen Sie den IIS-Benutzer (in meinem Fall IIS_IUSRS) und fügen Sie die Berechtigung Ändern und Schreiben hinzu.
  5. Bestätigen Sie diese Einstellungen mit der Schaltfläche Übernehmen.
DEXTER360
quelle
0

Der Entwicklungsserver muss als derselbe Benutzer ausgeführt werden, der über Schreibrechte für den Datenbankordner verfügt. Wenn Sie die Datenbank also ursprünglich als Root erstellt haben, müssen Sie bei der Ausführung als Root angemeldet sein:

python manage.py runserver
Kilizo
quelle
Obwohl technisch korrekt, rootist es eine schreckliche Idee , den Server so zu betreiben - Es wäre besser, chowndie Datenbank dem regulären, nicht privilegierten Benutzer zu
überlassen
0

Erstellen Sie ein Unterverzeichnis im Arbeitsverzeichnis

mkdir db-folder 

Erstellen Sie eine SQLite-Datenbank im Unterverzeichnis

sqlite3 db-folder/db.db

Ändern Sie den Eigentümer des Unterverzeichnisses in www-data in debain oder in apache in centOS

chown -R www-data db-folder

und schnapp dir ein kaltes Bier, denn du bist fertig.

P / S: um zu überprüfen, ob der Vorgang erfolgreich war

ls -l data-folder

Sie sollten solche sehen

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder
Brotich
quelle
Wenn Sie eine Antwort veröffentlichen möchten, geben Sie die Antwort ein, die sich erheblich von den anderen Antworten auf dieselbe Frage unterscheidet.
Masegaloeh
-1

schreib einfach sudo sqlite3 databaseFilename.sqlund es funktioniert

alireza valipour
quelle
Das könnte für eine interaktive Benutzersitzung funktionieren, ist aber nicht die Lösung, nicht für eine Webanwendung ...
HBruijn