Frage Warum bekomme ich SQL-Fehler, "Datenbankdatei kann nicht geöffnet werden"?


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

versuche eine schreibgeschützte Datenbank zu schreiben

Was ergab Sinn. Also habe ich die Berechtigungen für die Datei bearbeitet, so dass der Apache-Prozess Schreibrechte hatte. Aber anstatt es zu schreiben, bekomme 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 eine Stapelverfolgung notwendig ist.


61
2017-08-23 12:08


Ursprung


Sie denken, dass Sie dieses Problem bei der Bereitstellung hatten. - Mohammed Shareef C


Antworten:


Aha, ist gerade herüber gestolpert ein Artikel dies zu erklären. Auch Django haben Infos über ihre NewbieMistakes Seite.

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

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

sudo chown www-data .

76
2017-08-23 12:14



Dies setzt voraus, dass du auf debian / ubuntu bist, wenn du CentOS benutzt, wirst du 'apache' anstatt 'www-data' verwenden wollen - Luke Chadwick
@ nbolton Hinweis: chown www-data. . sollte eigentlich sein chown www-data . ansonsten gibt es einige Zauberer von chown Befehl, von denen ich nichts weiß ... bitte erleuchte mich. - Jeff Sheffield
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 nur aus dem Gedächtnis, aber ich empfehle Ihnen, dass Sie selbst ausprobieren. - Nick Bolton
Zusammengefasst im Falle zukünftiger Link Rot oder Tl; dr: SQLite3 möchte Schreibzugriff auf das Verzeichnis der DB-Datei, damit es dort eine Journaldatei erstellen kann, wenn eine Transaktion geöffnet wird. - user1454265
Sehr gut für Linux-Benutzer. Bupkiss für Windows. - Jay Blanchard


Von dem Django sagt "Kann Datenbankdatei nicht öffnen" bei Verwendung von SQLite3  Sektion des Anfänger Fehler Django Wiki Seite:

  1. Stellen Sie sicher, dass Apache auch in das übergeordnete Verzeichnis der Datenbank schreiben kann
  2. Stellen Sie sicher, dass keiner der Ordner des vollständigen Pfads der Datenbankdatei mit einer Nummer beginnt
  3. Stelle sicher, dass der vollständige Pfad der db Verzeichnis existiert
  4. Stellen Sie sicher, dass Ihre /tmp Verzeichnis ist weltweit beschreibbar
  5. Stellen Sie sicher, dass der Pfad zur Datenbank in angegeben ist settings.py ist ein voller Weg
  6. Stellen Sie sicher, dass sich im Pfad keine Sonderzeichen befinden
  7. Stellen Sie unter Windows sicher, dass der Datenbankverzeichnispfad mit doppelten Backlashes geschrieben wird

6
2018-01-14 22:43



Kopieren Sie hier die relevanten Teile des Links. - Christophe De Troyer
Und es ist eine Erwiderung! :) - Christophe De Troyer


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

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

(oder welche Db du auch benutzt)

wo Pi ist der Benutzer, den ich alle Dateien erstellt habe. (Ja, das ist ein Raspberry Pi)

Anstatt die Berechtigungen auf www-Daten zu ändern, musste ich die Berechtigungen nur wie folgt ändern:

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

Dies gibt Gruppenschreibzugriff auf die notwendigen Dateien und fügt den www-Datenbenutzer der pi-Gruppe hinzu.

Hinweis: Wenn Sie Logging haben, müssen Sie dies auch für das Django-Logfile tun oder Apache wird es nicht mögen.


5
2018-01-02 23:08



Ich denke du hättest gerade den pi Benutzer zur www-data Gruppe hinzugefügt. Außerdem hätten Sie die Dateien einfach so belassen und den Befehl setfacl verwenden können, um eine Zugriffskontrollliste für pi in den Dateien und Verzeichnissen hinzuzufügen. - slm
Setfacl klingt nach einer potenziell guten Option. Es wäre gut, dies als eine anweisende Antwort aufgeführt zu haben. Ein Problem, mit dem ich konfrontiert bin, ist, dass ich die .db-Datei oft beim Testen löschen muss. Wenn es neu erstellt wird, muss es erneut geklopft werden. - SpiRail
Sehen Sie meine Antwort für diese Frage, serverfault.com/a/462970/2518. Gibt es noch etwas, das ich hinzufügen sollte, was helfen würde? - slm


Das Hinzufügen eines operativen Benutzers zur www-Datengruppe funktioniert gut in meiner Testumgebung. Zusätzlich habe ich die sqlite3.db Datei in eine separate Datei geschrieben Unterordnerum sicherer zu sein.

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 erhält ein Mitglied der www-data group:

sudo usermod -a -G www-data hape

Erlaube Datenbank-Schreibzugriff auf 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

Dadurch kann auf die Datenbank read + write von apache2-daemon (Benutzerwww-data) zugegriffen werden, ohne dem Projektstammordner eine Bewilligung zu erteilen, und - andererseits - kann die App vom operational im dev-Modus ausgeführt werden Benutzer hape, z

./manage.py runserver

ebenfalls.


5
2018-04-14 12:22





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

Angenommen, Dateien gehören dem Apache-Benutzer zum Starten:

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

einstellen ACLs fü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

Du kannst sagen, es gibt ein ACL mit ls -l, das abschließende '+' auf den Berechtigungsbits:

# 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

1
2018-01-04 13:22



Die Einstellung des Besitzers / der Gruppe für den Apache-Prozess für das gesamte Django-Projekt ist eine schlechte Idee, keine unnötigen Privilegien zu geben. - benjaoming


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

Zum Windows 7, 8.1, 10, Server 2012, usw. folgen Bonobo Installationsanweisungen:

Erlaube dem IIS-Benutzer zu ändern     C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data-Ordner. 

Um dies zu tun:

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

1
2017-11-11 20:23





Der Entwicklungsserver muss als derselbe Benutzer ausgeführt werden, der write perms im Datenbankordner hat. Wenn Sie die Datenbank also ursprünglich als root erstellt haben, müssen Sie bei der Ausführung root sein:

python manage.py runserver

0
2017-12-19 09:35



Während technisch korrekt, läuft der Server als root ist ein furchtbar Idee - Es wäre besser chown die Datenbank für den normalen Benutzer ohne Rechte, der normalerweise den Server ausführt ... - voretaq7


Erstellen Sie ein Unterverzeichnis im Arbeitsverzeichnis

mkdir db-folder 

Erstellen Sie eine SQLite-Datenbank im Unterverzeichnis

sqlite3 db-folder/db.db

Ändern Sie den Besitzer für das Unterverzeichnis zu www-data in debain oder 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 das Verfahren erfolgreich war

ls -l data-folder

Sie sollten solche sehen

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

0
2018-06-17 22:49



Wenn Sie eine Antwort posten, geben Sie bitte die Antwort an, die sich wesentlich von den Antworten auf dieselbe Frage unterscheidet. - masegaloeh


einfach schreiben sudo sqlite3 databaseFilename.sql und es ist Arbeit


-1
2018-01-03 07:21



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