Pourquoi ai-je une erreur sqlite, «impossible d'ouvrir le fichier de base de données»?

65

En utilisant mon application Django, je peux très bien lire dans la base de données. Lorsque l'application n'avait pas la permission d'accéder au fichier, elle m'a donné cette erreur:

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

Ce qui avait du sens. J'ai donc modifié les autorisations sur le fichier, de sorte que le processus Apache dispose d'autorisations en é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 le résultat complet:

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.

Nick Bolton
la source
Je pense que vous avez eu ce problème lors de votre déploiement.
Mohammed Shareef C

Réponses:

79

Aha, je suis tombé sur un article expliquant cela. Django a aussi des infos sur sa page NewbieMistakes .

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

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

sudo chown www-data .
Nick Bolton
la source
3
Cela suppose que vous soyez sur debian / ubuntu, si vous utilisez CentOS, vous allez vouloir utiliser 'apache' au lieu de 'www-data'
Luke Chadwick
3
@ nbolton Remarque: Devrait en chown www-data. .fait être chown www-data .sinon il y a une sorcière de commande chown que je ne connais pas ... éclairez-moi s'il vous plaît.
Jeff Sheffield
3
Je crois que le point supplémentaire consiste à définir le groupe sur le groupe par défaut du propriétaire. Sinon, cela ne change pas le groupe. Ceci est juste de mémoire cependant, je vous recommande fortement de l'essayer vous-même.
Nick Bolton
Résumé ici en cas de lien futur ou tl; dr: SQLite3 souhaite un accès en écriture au répertoire du fichier de base de données afin de pouvoir créer un fichier journal à l'ouverture d'une transaction.
user1454265
Idéal pour les utilisateurs de Linux. Bupkiss pour Windows.
Jay Blanchard
7

Ma solution à cela é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 qui a créé tous les fichiers. (oui, c'est un framboise pi)

Au lieu de modifier les autorisations sur www-data, j'ai constaté qu'il me suffisait de modifier les autorisations de la manière suivante:

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

Cela donne aux groupes 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 aurez également besoin de le faire pour le fichier journal Django, sinon Apache ne l’aimera pas beaucoup.

SpiRail
la source
1
Je pense que vous auriez pu ajouter l'utilisateur pi au groupe www-data également. Vous auriez également pu laisser les fichiers tels quels et utiliser la commande setfacl pour ajouter une liste de contrôle d'accès pour pi sur les fichiers et / ou les répertoires.
Slm
setfacl semble être une bonne option. Il serait bon d’avoir cette liste en tant que réponse pédagogique. Un problème auquel je suis confronté est que je dois supprimer le fichier .db souvent lors des tests. Quand il est recréé, il doit être à nouveau chown.
SpiRail
Voir ma réponse à cette question, serverfault.com/a/462970/2518 . Y at-il quelque chose de plus que je devrais ajouter à ce qui pourrait aider?
slm
7

D'après Django, "Impossible d'ouvrir le fichier de base de données" lors de l'utilisation de la section SQLite3 de la page de wiki Django concernant les erreurs des débutants :

  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 numéro
  3. assurez-vous que le chemin complet du dbrépertoire existe
  4. assurez-vous que votre /tmprépertoire est accessible en écriture mondiale
  5. assurez-vous que le chemin d'accès à la base de données spécifiée settings.pyest 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 de la base de données est écrit avec des doubles barres obliques
ssc
la source
Copiez / collez les parties pertinentes du lien ici.
Christophe De Troyer
Et c'est un vote positif! :)
Christophe De Troyer Le
5

L'ajout d'un utilisateur opérationnel au groupe www-data fonctionne bien dans 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 base de données sera la propriété de www-data

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

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

sudo usermod -a -G www-data hape

Autorisez l'accès en écriture du 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 et en écriture par apache2-daemon (utilisateur www-data), sans octroyer d’autorisation au dossier racine du projet et, d’autre part, l’application peut être exécutée en mode dev utilisateur hape, par exemple

./manage.py runserver

aussi.

Hartmut P.
la source
1

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éfinir ACLspour 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 dire qu'il y a un ACLavec ls -l, le '+' à la fin des bits d'autorisations:

# 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
la source
Définir le propriétaire / groupe sur le processus apache pour l'ensemble du projet django est une mauvaise idée, inutile de donner des privilèges inutiles.
benjaoming
1

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

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

Autoriser l'utilisateur IIS à 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 éditer,
  4. sélectionnez l'utilisateur IIS (dans mon cas, IIS_IUSRS) et ajoutez l'autorisation Modifier et écrire,
  5. confirmez ces paramètres avec le bouton Appliquer.
DEXTER360
la source
0

Le serveur de développement doit être exécuté avec le même utilisateur que celui qui a des droits en écriture sur le dossier de la base de données. Par conséquent, si vous avez initialement créé la base de données en tant que root, vous devez être root lorsque vous exécutez:

python manage.py runserver
Kilizo
la source
Bien que techniquement correct, faire fonctionner le serveur rootest une très mauvaise idée - Ce serait mieux pour chownla base de données que pour l'utilisateur ordinaire non privilégié qui exécute normalement le serveur ...
voretaq7
0

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 attrapez une bière bien fraîche.

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

ls -l data-folder

vous devriez voir tel

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder
Brotich
la source
Si vous souhaitez publier une réponse, veuillez fournir une réponse très différente des autres réponses concernant la même question.
masegaloeh
-1

il suffit d'écrire sudo sqlite3 databaseFilename.sqlet c'est du travail

Alireza
la source
Cela pourrait fonctionner pour une session utilisateur interactive, mais ce n'est pas la solution pour une application Web ...
HBruijn