SQLite: base de datos de solo lectura

Tengo una base de datos SQLite que estoy usando para un sitio web. El problema es que cuando trato de INSERT INTO , obtengo una PDOException

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

Hice SSH en el servidor y compruebe los permisos, y la base de datos tiene los permisos

 -rw-rw-r-- 

No estoy tan familiarizado con los permisos * nix, pero estoy bastante seguro de que esto significa

  • No es un directorio
  • El propietario tiene permisos de lectura / escritura (ese soy yo, de acuerdo con ls -l )
  • El grupo tiene permisos de lectura / escritura
  • Todos los demás solo tienen permisos de lectura

También busqué en todas partes que conocía el uso del progtwig sqlite3 , y no encontré nada relevante.

Debido a que no sabía con qué permisos PDO intenta abrir la base de datos, lo hice

 chmod o+w supplies.db 

Ahora, tengo otra PDOException :

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

Pero SÓLO ocurre cuando bash ejecutar una consulta INSERT luego de que la base de datos está abierta.

¿Alguna idea de lo que está pasando?

El problema es que el controlador PDO SQLite requiere que si va a realizar una operación de escritura ( INSERT , UPDATE , DELETE , DROP , etc.), la carpeta en la que reside la base de datos debe tener permisos de escritura, como así como el archivo de base de datos real.

Encontré esta información en un comentario en la parte inferior de la página del manual del controlador PDO SQLite .

Esto puede suceder cuando el propietario del archivo SQLite no es el mismo que el usuario que ejecuta el script. Se pueden producir errores similares si no se puede escribir toda la ruta del directorio (es decir, cada directorio en el camino).

¿A quién pertenece el archivo SQLite? ¿Tú?

¿Con quién se está ejecutando el script? Apache o nadie?

Para mí, el problema era la aplicación de SELinux en lugar de los permisos. El error de “solo lectura de la base de datos” desapareció una vez que deshabilité la aplicación, siguiendo la sugerencia de Steve V. en un comentario sobre la respuesta aceptada.

 echo 0 >/selinux/enforce 

Al ejecutar este comando, todo funcionó según lo previsto (CentOS 6.3).

El problema específico que encontré fue durante la configuración de Graphite. Comprobé tres veces que el usuario de apache poseía y podía escribir tanto en graphite.db como en mi directorio padre. Pero hasta que “arreglé” SELinux, todo lo que obtuve fue un seguimiento de la stack con el efecto de: DatabaseError: intentar escribir una base de datos de solo lectura

Esto puede ser causado por SELinux. Si no desea deshabilitar completamente SELinux, debe establecer el directorio db fcontext a httpd_sys_rw_content_t.

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

Obtuve el mismo error de IIS en Windows 7. Para solucionar este error, tuve que agregar permisos de control total a la cuenta IUSR para el archivo de base de datos sqlite. No necesita cambiar los permisos si usa sqlite en webmatrix en lugar de IIS.

Obtuve este error cuando intenté escribir en una base de datos en un sistema Android.

Aparentemente, sqlite3 no solo necesita permisos de escritura para el archivo de base de datos y el directorio contenedor (como ya dijo @ austin-hyde en su respuesta), sino también la variable de entorno TMPDIR tiene que apuntar a un directorio (posiblemente editable).

En mi sistema Android lo configuré en TMPDIR="/data/local/tmp" y ahora mi script se ejecuta como esperaba 🙂

Lo obtuve en mi navegador cuando cambié de http: // localhost a http: //my.local.ip.address y luego volví a cambiar a localhost – era necesario permanecer con la dirección IP una vez que había cambiado a eso una vez