una - sqlite android tutorial español
SQLite: base de datos de solo lectura (7)
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 programa 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 intento 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 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(/.*)?"
restorecon -v /var/www/railsapp/db
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?
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
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 :)
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 pila con el efecto de: DatabaseError: intentar escribir una base de datos de solo lectura