¿Por qué aparece el error sqlite, "no se puede abrir el archivo de base de datos"?


65

Usando mi aplicación Django, puedo leer bien de la base de datos. Cuando la aplicación no tenía permiso para acceder al archivo, me dio este error:

intenta escribir una base de datos de solo lectura

Lo cual tenía sentido. Así que edité los permisos en el archivo, para que el proceso de Apache tuviera permisos de escritura. Sin embargo, en lugar de poder escribir, me sale este error críptico:

no se puede abrir el archivo de base de datos

Si es útil, aquí está el resultado completo:

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500

Avíseme si es necesario un seguimiento de pila.


Cree que tuvo este problema cuando estaba implementando.
Mohammed Shareef C

Respuestas:


79

Ajá, me topé con un artículo que explica esto. También Django tiene información en su página NewbieMistakes .

La solución es asegurarse de que el directorio que contiene el archivo de la base de datos también tenga acceso de escritura permitido al proceso.

En mi caso, ejecutar este comando solucionó el problema:

sudo chown www-data .

3
Esto supone que está en debian / ubuntu, si está usando CentOS, querrá usar 'apache' en lugar de 'www-data'
Luke Chadwick

3
@nbolton Nota: en chown www-data. .realidad debería ser de chown www-data .otra manera, hay algún mago de comando chown que no conozco ... por favor, ilumíneme.
Jeff Sheffield

3
Creo que el punto extra es establecer el grupo en el grupo predeterminado del propietario. De lo contrario, no cambia el grupo. Sin embargo, esto es solo de memoria, le recomiendo que lo pruebe usted mismo.
Nick Bolton

Resumido aquí en caso de rotura de enlace futura o tl; dr: SQLite3 quiere acceso de escritura al directorio del archivo DB para que pueda crear un archivo de diario allí cuando se abre una transacción.
user1454265

Ideal para usuarios de Linux. Bupkiss para Windows.
Jay Blanchard

7

Mi solución a esto fue más o menos así. Realmente no quería cambiar la propiedad de este directorio. (principalmente porque uso el usuario pi para hacer cosas como git)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db

(o lo que sea que estés usando)

donde pi es el usuario en el que creé todos los archivos. (sí, este es un raspberry pi)

En lugar de cambiar los permisos a www-data, descubrí que solo necesitaba cambiar los permisos de esta manera:

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data

Esto proporciona acceso de escritura grupal a los archivos necesarios y agrega el usuario www-data al grupo pi.

Nota: si tiene un registro, deberá hacer esto también para el archivo de registro de django o apache no le gustará mucho.


1
Creo que también podría haber agregado el usuario pi al grupo www-data. También podría haber dejado los archivos tal como están y haber utilizado el comando setfacl para agregar una lista de control de acceso para pi en los archivos o directorios.
slm

setfacl suena como una opción potencialmente buena. Sería bueno tener esto como una respuesta instructiva. Un problema que enfrento es que necesito eliminar el archivo .db a menudo en las pruebas. Cuando se recrea, necesita ser devorado nuevamente.
SpiRail

Vea mi respuesta para esta pregunta, serverfault.com/a/462970/2518 . ¿Hay algo más que debería agregar a eso que ayudaría?
slm 01 de

7

Desde el Django dice "No se puede abrir el archivo de base de datos" cuando se usa la sección SQLite3 de la página wiki de Django de errores de novato :

  1. asegúrese de que Apache también pueda escribir en el directorio principal de la base de datos
  2. asegúrese de que ninguna de las carpetas de la ruta completa del archivo de base de datos comience con un número
  3. asegúrese de dbque exista la ruta completa del directorio
  4. asegúrese de que su /tmpdirectorio sea de escritura mundial
  5. asegúrese de que la ruta a la base de datos especificada en settings.pyes una ruta completa
  6. asegúrese de que no haya caracteres especiales en la ruta
  7. en Windows, asegúrese de que la ruta del directorio db esté escrita con doble barra invertida

Copie / pegue las partes relevantes del enlace aquí.
Christophe De Troyer

¡Y es un voto a favor! :)
Christophe De Troyer

5

Agregar un usuario operativo al grupo www-data está funcionando bien en mi entorno de prueba. Además, puse el archivo sqlite3.db en una subcarpeta separada , para ser más seguro.

El archivo de la base de datos será propiedad de www-data

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db

Mi usuario operativo hape obtiene un miembro del grupo www-data:

sudo usermod -a -G www-data hape

Permitir el acceso de escritura del archivo de base de datos a los miembros del grupo www-data:

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db

Como resultado, se puede acceder a la base de datos de lectura + escritura mediante apache2-daemon (usuario www-data), sin otorgar la concesión a la carpeta raíz del proyecto y, por otro lado, la aplicación puede ejecutarse en modo dev usuario hape, por ejemplo

./manage.py runserver

además.


1

Tomado de la pregunta SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Suponiendo que los archivos son propiedad del usuario de apache para comenzar:

% chown -R apache.apache /var/www/mysite

configurado ACLspara usuario / grupo pi:

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x

Puedes ver que hay un ACLcon ls -l, el '+' final en los bits de permisos:

# ls -la /var/www
drwxr-xr-x   3 apache   apache   80 26. Nov 12:43 .
drwxrwxrwt  15 root     root 360 26. Nov 12:40 ..
drwxrwxr-x+  2 apache   apache   40 26. Nov 12:43 mysite

Configurar el propietario / grupo para el proceso de apache para todo el proyecto django es una mala idea, no es necesario otorgar privilegios innecesarios.
benjaoming 01 de

1

La solución es asegurarse de que el directorio que contiene el archivo de la base de datos también tenga acceso de escritura permitido al proceso.

Para Windows 7, 8.1, 10, Server 2012, etc., siga las instrucciones de instalación de Bonobo :

Permita que el usuario de IIS modifique la carpeta C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data.

Para hacerlo:

  1. seleccione Propiedades de la carpeta App_Data,
  2. ve a la pestaña Seguridad,
  3. haga clic en editar,
  4. seleccione el usuario IIS (en mi caso IIS_IUSRS) y agregue el permiso Modificar y Escribir,
  5. confirme esta configuración con el botón Aplicar.

0

El servidor de desarrollo debe ejecutarse como el mismo usuario que tiene permisos de escritura en la carpeta de la base de datos, por lo que si originalmente creó la base de datos como root, deberá ser root cuando ejecute:

python manage.py runserver

Si bien técnicamente correcto, ejecutar el servidor rootes una horrible idea - Sería mejor a chownla base de datos para el usuario sin privilegios regular que normalmente se ejecuta el servidor ...
voretaq7

0

crear un subdirectorio en el directorio de trabajo

mkdir db-folder 

crear una base de datos sqlite en el subdirectorio

sqlite3 db-folder/db.db

cambiar el propietario del subdirectorio a www-data en debain o apache en centOS

chown -R www-data db-folder

y toma una cerveza fría porque estás listo.

P / S: para verificar si el procedimiento fue exitoso

ls -l data-folder

deberías ver tal

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder

Si va a publicar una respuesta, proporcione la respuesta que sea sustancialmente diferente a las otras respuestas en la misma pregunta.
masegaloeh

-1

solo escribe sudo sqlite3 databaseFilename.sqly es trabajo


Eso podría funcionar para una sesión de usuario interactiva, pero no es la solución, no para una aplicación web ...
HBruijn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.