web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens une erreur sqlite, "impossible d'ouvrir le fichier de base de données"?

En utilisant mon Django app, je suis capable de lire très bien à partir de la base de données. Lorsque l'application n'a pas eu l'autorisation d'accéder au fichier, elle m'a donné cette erreur:

tenter d'écrire une base de données en lecture seule

Ce qui était logique. J'ai donc modifié les autorisations sur le fichier, afin que le processus Apache ait des autorisations d'écriture. Cependant, au lieu de pouvoir écrire, j'obtiens cette erreur cryptique:

impossible d'ouvrir le fichier de base de données

Si c'est utile, voici la sortie entière:

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

Faites-moi savoir si une trace de pile est nécessaire.

65
Nick Bolton

Aha, je suis juste tombé sur n article expliquant cela. Aussi Django ont des informations sur leur NewbieMistakes page.

La solution consiste à s'assurer que le répertoire contenant le fichier de base de données dispose également d'un accès en écriture au processus.

Dans mon cas, l'exécution de cette commande a résolu le problème:

Sudo chown www-data .
80
Nick Bolton

Ma solution était plus comme ça. Je ne voulais pas vraiment changer la propriété de ce répertoire. (principalement parce que j'utilise l'utilisateur pi pour faire des choses comme git)

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

(ou quelle que soit la base de données que vous utilisez)

où pi est l'utilisateur dans lequel j'ai créé tous les fichiers. (oui c'est un Raspberry Pi)

Au lieu de changer les autorisations en www-data, j'ai constaté que je n'avais besoin que de modifier les autorisations comme ceci:

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

Cela donne au groupe un accès en écriture aux fichiers nécessaires et ajoute l'utilisateur www-data au groupe pi.

Remarque: si vous avez une journalisation, vous devrez le faire pour le Django logfile également ou Apache ne l'aimera pas beaucoup.

7
SpiRail

Dans le Django dit "Impossible d'ouvrir le fichier de base de données" lors de l'utilisation de SQLite3 section du Erreurs débutant Django wiki page :

  1. assurez-vous qu'Apache peut également écrire dans le répertoire parent de la base de données
  2. assurez-vous qu'aucun des dossiers du chemin complet du fichier de base de données ne commence par un nombre
  3. assurez-vous que le chemin complet du répertoire db existe
  4. assurez-vous que votre /tmp le répertoire est accessible en écriture
  5. assurez-vous que le chemin d'accès à la base de données spécifié dans settings.py est un chemin complet
  6. assurez-vous qu'il n'y a pas de caractères spéciaux dans le chemin
  7. sous Windows, assurez-vous que le chemin du répertoire db est écrit avec des doubles contre-coups
7
ssc

L'ajout d'un utilisateur opérationnel au groupe www-data fonctionne bien sur mon environnement de test. De plus, j'ai mis le fichier sqlite3.db dans un sous-dossier séparé, pour plus de sécurité.

Le fichier de la base de données appartient à www-data

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

Mon utilisateur opérationnel devient membre du groupe www-data:

Sudo usermod -a -G www-data hape

Autorisez l'accès en écriture au fichier de base de données aux membres du groupe 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

En conséquence, la base de données est accessible en lecture + écriture par le démon Apache2 (utilisateur www-data), sans accorder de subvention au dossier racine du projet, et - d'autre part - l'application peut être exécutée en mode dev par le gestionnaire opérationnel. forme d'utilisateur, par exemple.

./manage.py runserver

aussi.

5
Hartmut P.

Emprunté à SO question: https://stackoverflow.com/questions/4283132/Apache-instance-user-permission-issue

En supposant que les fichiers appartiennent à l'utilisateur Apache pour démarrer:

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

définissez ACLs pour l'utilisateur/groupe 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

Vous pouvez voir qu'il y a un ACL avec ls -l, le "+" de fin sur les bits d'autorisation:

# 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
slm

La solution consiste à s'assurer que le répertoire contenant le fichier de base de données dispose également d'un accès en écriture au processus.

Pour Windows 7, 8.1, 10, Server 2012, etc., suivez les instructions d'installation de Bonobo :

Autoriser IIS Utilisateur pour modifier le dossier C:\inetpub\wwwroot\Bonobo.Git.Server\App_Data.

Faire cela:

  1. sélectionnez Propriétés du dossier App_Data,
  2. allez dans l'onglet Sécurité,
  3. cliquez sur modifier,
  4. sélectionnez IIS utilisateur (dans mon cas IIS_IUSRS) et ajoutez l'autorisation Modifier et écrire,
  5. confirmez ces paramètres avec le bouton Appliquer.
1
DEXTER360

Le serveur de développement doit être exécuté en tant que même utilisateur qui a des autorisations d'écriture sur le dossier de la base de données, donc si vous avez initialement créé la base de données en tant que root, vous devrez être root lorsque vous exécutez:

python manage.py runserver
0
Kilizo

créer un sous-répertoire dans le répertoire de travail

mkdir db-folder 

créer une base de données sqlite dans le sous-répertoire

sqlite3 db-folder/db.db

changer le propriétaire du sous-répertoire en www-data dans debain ou Apache dans centOS

chown -R www-data db-folder

et prenez une bière froide car vous avez terminé.

P/S: pour vérifier si la procédure a réussi

ls -l data-folder

vous devriez voir une telle

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