SQLite: database di sola lettura

Ho un database SQLite che sto usando per un sito web. Il problema è che quando provo ad INSERT INTO , ottengo un PDOException

 SQLSTATE[HY000]: General error: 8 attempt to write a readonly database 

Ho inserito SSH nel server e controllato le autorizzazioni e il database ha le autorizzazioni

 -rw-rw-r-- 

Non sono così familiare con i permessi * nix, ma sono abbastanza sicuro che questo significhi

  • Non una directory
  • Il proprietario ha i permessi di lettura / scrittura (sono io, secondo ls -l )
  • Il gruppo ha i permessi di lettura / scrittura
  • Tutti gli altri hanno solo i permessi di lettura

Ho anche guardato ovunque sapessi usare il programma sqlite3 e non ho trovato nulla di rilevante.

Perché non sapevo con quali autorizzazioni PDO stia cercando di aprire il database, l’ho fatto

 chmod o+w supplies.db 

Ora, ottengo un’altra PDOException :

 SQLSTATE[HY000]: General error: 14 unable to open database file 

Ma si verifica SOLO quando cerco di eseguire una query INSERT dopo che il database è aperto.

Qualche idea su cosa sta succedendo?

Il problema, a quanto risulta, è che il driver SQLite PDO richiede che se si eseguirà un’operazione di scrittura ( INSERT , UPDATE , DELETE , DROP , ecc.), La cartella in cui risiede il database deve disporre delle autorizzazioni di scrittura, come così come il vero file di database.

Ho trovato queste informazioni in un commento nella parte inferiore della pagina di manuale del driver di SQLite PDO .

Ciò può accadere quando il proprietario del file SQLite non è uguale all’utente che esegue lo script. Errori simili possono verificarsi se non è ansible scrivere sull’intero percorso della directory (che significa ogni directory lungo la strada).

Chi è il proprietario del file SQLite? Tu?

Chi è lo script in esecuzione come? Apache o nessuno?

Per me il problema era l’ applicazione di SELinux piuttosto che le autorizzazioni. L’errore “database di sola lettura” è andato via una volta disabilitata l’applicazione, seguendo il suggerimento di Steve V. in un commento sulla risposta accettata.

 echo 0 >/selinux/enforce 

Dopo aver eseguito questo comando, tutto ha funzionato come previsto (CentOS 6.3).

Il problema specifico che avevo riscontrato era durante l’installazione di Graphite. Ho controllato in triplo che l’utente apache possedesse e potesse scrivere sia sul mio graphite.db che sulla sua directory genitore. Ma fino a quando ho “risolto” SELinux, tutto ciò che ho ottenuto è stato una traccia dello stack con l’effetto di: DatabaseError: tentativo di scrivere un database di sola lettura

Questo può essere causato da SELinux. Se non si desidera disabilitare completamente SELinux, è necessario impostare la directory db fcontext su httpd_sys_rw_content_t.

 semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?" restorecon -v /var/www/railsapp/db 

Ho ricevuto lo stesso errore da IIS in Windows 7. Per correggere questo errore ho dovuto aggiungere le autorizzazioni di controllo completo all’account IUSR per il file di database sqlite. Non è necessario modificare le autorizzazioni se si utilizza sqlite in webmatrix anziché IIS.

Ho ricevuto questo errore quando ho provato a scrivere su un database su un sistema Android.

Apparentemente sqlite3 non ha solo bisogno di permessi di scrittura per il file di database e la directory contenente (come già detto @ austin-hyde nella sua risposta), ma anche la variabile di ambiente TMPDIR deve puntare a una directory (possibilmente scrivibile).

Sul mio sistema Android l’ho impostato su TMPDIR="/data/local/tmp" e ora il mio script funziona come previsto 🙂

Ho ottenuto questo nel mio browser quando ho cambiato da http: // localhost a http: //my.local.ip.address e poi cambiato di nuovo in localhost – era necessario rimanere con l’indirizzo IP una volta che avevo cambiato quella volta