SQLite: database somente leitura

Eu tenho um database SQLite que estou usando para um site. O problema é que quando eu tento PDOException lo, recebo uma PDOException

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

Eu SSH’d no servidor e verifiquei as permissions, e o database tem as permissions

 -rw-rw-r-- 

Eu não sou tão familiarizado com as permissions do * nix, mas tenho certeza que isso significa

  • Não é um diretório
  • O proprietário tem permissions de leitura / gravação (sou eu, de acordo com ls -l )
  • Grupo tem permissions de leitura / gravação
  • Todos os outros só têm permissions de leitura

Eu também procurei em todos os lugares que eu conhecia usando o programa sqlite3 e não encontrei nada relevante.

Porque eu não sabia com quais permissions o PDO está tentando abrir o database, eu fiz

 chmod o+w supplies.db 

Agora recebo outra PDOException :

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

Mas isso ocorre apenas quando tento executar uma consulta INSERT depois que o database é aberto.

Alguma idéia do que está acontecendo?

O problema, como se constatou, é que o driver PDO SQLite requer que, se você for fazer uma operação de gravação ( INSERT , UPDATE , DELETE , DROP , etc), a pasta na qual o database reside deve ter permissions de gravação, como bem como o arquivo de database real.

Eu encontrei esta informação em um comentário na parte inferior da página do manual do driver PDO SQLite .

Isso pode acontecer quando o proprietário do arquivo SQLite em si não é o mesmo que o usuário que está executando o script. Erros semelhantes podem ocorrer se o caminho do diretório inteiro (significando cada diretório ao longo do caminho) não puder ser gravado.

Quem possui o arquivo SQLite? Você?

Quem é o script que está sendo executado? Apache ou Nobody?

Para mim, o problema foi a aplicação do SELinux, em vez de permissions. O erro “database somente leitura” desapareceu quando eu desativei a aplicação, seguindo a sugestão feita por Steve V. em um comentário sobre a resposta aceita.

 echo 0 >/selinux/enforce 

Ao executar este comando, tudo funcionou como pretendido (CentOS 6.3).

O problema específico que encontrei foi durante a configuração do Graphite. Eu verifiquei triplamente se o usuário do apache possuía e poderia gravar em meu graphite.db e em seu diretório pai. Mas até eu “consertar” o SELinux, tudo que consegui foi um rastreamento de pilha para o efeito de: DatabaseError: tentativa de escrever um database readonly

Isso pode ser causado pelo SELinux. Se você não quiser desabilitar o SELinux completamente, você precisa configurar o fcontext do diretório db para httpd_sys_rw_content_t.

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

Eu tenho o mesmo erro do IIS no Windows 7. Para corrigir esse erro eu tive que adicionar permissions de controle total para a conta IUSR para o arquivo de database sqlite. Você não precisa alterar permissions se usar o sqlite em webmatrix em vez de IIS.

Eu recebi esse erro quando tentei gravar em um database em um sistema Android.

Aparentemente sqlite3 não só precisa escrever permissions para o arquivo de database e o diretório contendo (como @ austin-hyde já disse em sua resposta), mas também a variável de ambiente TMPDIR tem que apontar para um diretório (possivelmente gravável).

No meu sistema Android eu configurei para TMPDIR="/data/local/tmp" e agora meu script é executado como esperado 🙂

Eu tenho isso no meu navegador quando eu mudei de usar http: // localhost para http: //my.local.ip.address e, em seguida, mudou de volta para localhost – era necessário ficar com o endereço IP, uma vez que eu tinha mudado para que uma vez