Tengo una base de datos SQLite que estoy usando para un sitio web. El problema es que cuando lo intento INSERT INTO
, obtengo unPDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
SSH'd en el servidor y revisé 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, según
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 sqlite3
programa, y no encontré nada relevante.
Como no sabía con qué permisos PDO está tratando de abrir la base de datos, lo hice
chmod o+w supplies.db
Ahora tengo otro PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Pero SOLO ocurre cuando intento ejecutar una INSERT
consulta después de que la base de datos está abierta.
¿Alguna idea de lo que está pasando?
sqlite
permissions
Austin Hyde
fuente
fuente
sudo chgrp www-data test.db
con agregar permisos funcionó para míRespuestas:
El problema, como resulta, es que el conductor DOP SQLite requiere que si se va a realizar una operación de escritura (
INSERT
,UPDATE
,DELETE
,DROP
, etc), luego en la carpeta de la base de datos reside en deben tener permisos de escritura, así como la real archivo de base de datos.Encontré esta información en un comentario en la parte inferior de la página del manual del controlador PDO SQLite .
fuente
.db
, una.db-shm
, y una.db-wal
archivos, y por supuesto el directorio padre de los tres, el cual debe ser toda escritura para el usuario que ejecuta el programa.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 en toda la ruta del directorio (es decir, en cada directorio del camino).
¿A quién pertenece el archivo SQLite? ¿Tú?
¿A quién se ejecuta el script? Apache o nadie?
fuente
file_put_contents('./foo.txt', 'Hello, world');
), que le mostrará a quién se está ejecutando. Lo más probable es que necesite que el script cree la base de datos SQLite. Este puede ser un ejercicio entretenido si ya tiene datos en su archivo actual ...posix_getuid()
tampoco funcionaPara mí, el problema era la aplicación de SELinux en lugar de los permisos. El error de "base de datos de solo lectura" desapareció una vez que desactivé la aplicación, siguiendo la sugerencia hecha por Steve V. en un comentario sobre la respuesta aceptada.
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. Verifiqué tres veces que el usuario de apache era propietario y podía escribir tanto en mi graphite.db como en su directorio principal. Pero hasta que "solucioné" SELinux, todo lo que obtuve fue un seguimiento de la pila en el sentido de: DatabaseError: intento de escribir una base de datos de solo lectura
fuente
Esto puede ser causado por SELinux. Si no desea deshabilitar SELinux por completo, debe configurar el directorio db fcontext en httpd_sys_rw_content_t.
fuente
Recibí este error cuando intenté escribir en una base de datos en un sistema Android.
Aparentemente, sqlite3 no solo necesita permisos de escritura en el archivo de la base de datos y el directorio que lo contiene (como ya dijo @ austin-hyde en su respuesta) sino que también la variable de entorno
TMPDIR
debe apuntar a un directorio (posiblemente editable).En mi sistema Android lo configuré
TMPDIR="/data/local/tmp"
y ahora mi script se ejecuta como se esperaba :)Editar:
Si no puede establecer variables de entorno, puede usar uno de los otros métodos enumerados aquí: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations como
PRAGMA temp_store_directory = 'directory-name';
fuente
Recibí 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.
fuente
En resumen, he solucionado el problema poniendo el archivo de base de datos (* .db) en una subcarpeta.
fuente
Obtuve esto en mi navegador cuando cambié de usar http: // localhost a http://145.900.50.20 (donde 145.900.50.20 es mi dirección IP local) y luego volví a cambiar a localhost: era necesario permanecer con el Dirección IP una vez que había cambiado a esa vez
fuente
Solía:
para averiguar quién está ejecutando el script (por ejemplo, nombre de usuario), y luego le dio al usuario permisos para todo el directorio de la aplicación, como:
Espero que esto ayude a alguien por ahí.
fuente