Perché viene visualizzato l'errore sqlite, "impossibile aprire il file di database"?


65

Usando la mia app Django, sono in grado di leggere bene dal database. Quando l'applicazione non aveva il permesso di accedere al file, mi ha dato questo errore:

tenta di scrivere un database di sola lettura

Il che aveva senso. Quindi ho modificato le autorizzazioni sul file, in modo che il processo Apache avesse le autorizzazioni di scrittura. Tuttavia, invece di poter scrivere, ottengo questo errore criptico:

impossibile aprire il file di database

Se è utile, ecco l'intero output:

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

Fammi sapere se è necessaria una traccia dello stack.


Pensa di avere questo problema durante la distribuzione.
Mohammed Shareef C

Risposte:


79

Ah, mi sono appena imbattuto in un articolo che spiega questo. Anche Django ha informazioni sulla sua pagina NewbieMistakes .

La soluzione è assicurarsi che anche la directory che contiene il file di database abbia accesso in scrittura al processo.

Nel mio caso, l'esecuzione di questo comando ha risolto il problema:

sudo chown www-data .

3
Ciò presuppone che tu sia su debian / ubuntu, se stai usando CentOS vorrai usare 'apache' invece di 'www-data'
Luke Chadwick

3
@nbolton Nota: in chown www-data. .realtà dovrebbe esserci chown www-data .altrimenti c'è qualche mago del comando chown di cui non so ... per favore illuminami.
Jeff Sheffield,

3
Credo che il punto in più sia quello di impostare il gruppo sul gruppo predefinito del proprietario. Altrimenti non cambia il gruppo. Questo è solo dalla memoria, ti consiglio vivamente di provarlo tu stesso.
Nick Bolton,

Riassunto qui in caso di futuro collegamento rot o tl; dr: SQLite3 desidera l'accesso in scrittura alla directory del file DB in modo che possa creare lì un file journal quando viene aperta una transazione.
user1454265

Ottimo per gli utenti Linux. Bupkiss per Windows.
Jay Blanchard,

7

La mia soluzione a questo è stata più simile. Non volevo davvero cambiare la proprietà di questa directory. (principalmente perché uso l'utente pi per fare cose come git)

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

(o qualunque db stai usando)

dove pi è l'utente in cui ho creato tutti i file. (sì, questo è un raspberry pi)

Invece di cambiare le autorizzazioni in www-data, ho scoperto che avevo solo bisogno di cambiare le autorizzazioni in questo modo:

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

Ciò consente al gruppo l'accesso in scrittura ai file necessari e aggiunge l'utente www-data al gruppo pi.

Nota: se hai la registrazione, dovrai farlo anche per il file di log di django o ad Apache non piacerà molto.


1
Penso che potresti aver appena aggiunto l'utente pi anche al gruppo www-data. Inoltre avresti potuto lasciare i file così come sono e usare il comando setfacl per aggiungere un elenco di controllo di accesso per pi sui file e / o directory.
slm

setfacl sembra un'opzione potenzialmente buona. Sarebbe bello avere questo elencato come una risposta istruttiva. Un problema che devo affrontare è che ho bisogno di eliminare il file .db spesso durante i test. Quando viene ricreato, deve essere rinominato nuovamente.
SpiRail

Vedi la mia risposta a questa domanda, serverfault.com/a/462970/2518 . C'è qualcosa in più che dovrei aggiungere a ciò che potrebbe aiutare?
slm

7

Dal Django dice "Impossibile aprire il file di database" quando si utilizza la sezione SQLite3 della pagina wiki Django errori Newbie :

  1. assicurarsi che Apache possa anche scrivere nella directory principale del database
  2. assicurarsi che nessuna delle cartelle del percorso completo del file di database inizi con un numero
  3. assicurarsi che dbesista il percorso completo della directory
  4. assicurati che la tua /tmpdirectory sia scrivibile in tutto il mondo
  5. assicurarsi che il percorso del database specificato in settings.pysia un percorso completo
  6. assicurati che non ci siano caratteri speciali nel percorso
  7. su Windows, assicurarsi che il percorso della directory db sia scritto con doppi giochi

Copia / incolla qui le parti pertinenti del link.
Christophe De Troyer,

Ed è un voto! :)
Christophe De Troyer,

5

L'aggiunta di un utente operativo al gruppo www-data funziona bene nel mio ambiente di test. Inoltre, ho messo il file sqlite3.db in una sottocartella separata , per essere più sicuro.

Il file di database deve essere di proprietà di www-data

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

La mia hape utente operativa ottiene un membro del gruppo www-data:

sudo usermod -a -G www-data hape

Consenti l'accesso in scrittura al file di database ai membri dei dati www del gruppo:

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

Di conseguenza, è possibile accedere al database read + write da apache2-daemon (dati www utente), senza concedere la cartella principale del progetto e, d'altra parte, l'app può essere eseguita in modalità dev dal operativo utente hape, ad es

./manage.py runserver

anche.


1

Preso in prestito dalla domanda SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Supponendo che i file siano di proprietà dell'utente apache per iniziare:

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

impostato ACLsper utente / gruppo 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

Puoi dire che c'è un ACLcon ls -l, il '+' finale sui bit delle autorizzazioni:

# 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

Impostare il proprietario / gruppo sul processo apache per l'intero progetto Django è una cattiva idea, non è necessario fornire privilegi non necessari.
benjaoming

1

La soluzione è assicurarsi che anche la directory che contiene il file di database abbia accesso in scrittura al processo.

Per Windows 7, 8.1, 10, Server 2012, ecc. Seguire le istruzioni di installazione di Bonobo :

Consenti all'utente IIS di modificare la cartella C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data.

Fare così:

  1. seleziona Proprietà della cartella App_Data,
  2. vai alla scheda Sicurezza,
  3. fai clic su modifica,
  4. seleziona utente IIS (nel mio caso IIS_IUSRS) e aggiungi l'autorizzazione Modifica e Scrivi,
  5. confermare queste impostazioni con il pulsante Applica.

0

Il server di sviluppo deve essere eseguito come lo stesso utente che ha i permessi di scrittura nella cartella del database, quindi se il database è stato originariamente creato come root, sarà necessario essere root quando si esegue:

python manage.py runserver

Sebbene tecnicamente corretto, eseguire il server come rootè una terribile idea - Sarebbe meglio per chownil database per l'utente normale non privilegiato che normalmente esegue il server ...
voretaq7

0

crea una sottodirectory nella directory di lavoro

mkdir db-folder 

crea un database sqlite nella sottodirectory

sqlite3 db-folder/db.db

cambia proprietario per la sottodirectory in www-data in debain o apache in centOS

chown -R www-data db-folder

e prendi una birra fredda perché hai finito.

P / S: per verificare se la procedura è andata a buon fine

ls -l data-folder

dovresti vederlo

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

Se hai intenzione di pubblicare una risposta, fornisci la risposta sostanzialmente diversa dalle altre risposte sulla stessa domanda.
Masegaloeh,

-1

basta scrivere sudo sqlite3 databaseFilename.sqled è lavoro


Potrebbe funzionare per una sessione utente interattiva ma non è la soluzione non per un'applicazione Web ...
HBruijn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.