Por que recebo erro de sqlite, “não é possível abrir o arquivo de banco de dados”?

61

Usando meu aplicativo Django, consigo ler o banco de dados muito bem. Quando o aplicativo não tinha permissão para acessar o arquivo, ele me deu este erro:

attempt to write a readonly database

O que fez sentido. Então editei as permissões no arquivo, para que o processo do Apache tivesse permissões de gravação. No entanto, em vez de poder escrever, recebo este erro crítico:

unable to open database file

Se for útil, aqui está a saída inteira:

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

Deixe-me saber se um rastreamento de pilha é necessário.

    
por Nick Bolton 23.08.2009 / 12:08

9 respostas

76

Aha, nos deparamos com artigo explicando isso. O Django também tem informações sobre a página NewbieMistakes .

A solução é garantir que o diretório que contém o arquivo de banco de dados também tenha acesso de gravação permitido ao processo.

No meu caso, a execução desse comando resolveu o problema:

sudo chown www-data .
    
por 23.08.2009 / 12:14
6

Do o Django diz "Não é possível abrir o arquivo do banco de dados" ao usar a seção SQLite3 dos erros do Newbie wiki do Django página :

  1. verifique se o Apache também pode gravar no diretório pai do banco de dados
  2. certifique-se de que nenhuma das pastas do caminho completo do arquivo de banco de dados inicie com um número
  3. verifique se o caminho completo do diretório db existe
  4. certifique-se de que seu diretório /tmp seja mundialmente editável
  5. verifique se o caminho para o banco de dados especificado em settings.py é um caminho completo
  6. verifique se não há caracteres especiais no caminho
  7. no Windows, verifique se o caminho do diretório db está escrito com folgas duplas
por 14.01.2010 / 22:43
5

Minha solução para isso foi mais assim. Eu realmente não queria mudar a propriedade deste diretório. (principalmente porque eu uso o usuário pi para fazer coisas como git)

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

(ou qualquer db que você esteja usando)

onde pi é o usuário que eu criei todos os arquivos dentro (sim, isso é um pi framboesa)

Em vez de alterar as permissões para www-data, descobri que só precisava alterar as permissões assim:

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

Isso dá ao grupo acesso de gravação aos arquivos necessários e adiciona o usuário www-data ao grupo pi.

Nota: se você tiver log, você precisará fazer isto para o logfile do django, ou o apache não vai gostar muito.

    
por 02.01.2013 / 23:08
5

Adicionar um usuário operacional ao grupo www-data está funcionando bem no meu ambiente de teste. Além disso, coloquei o arquivo sqlite3.db em uma subpasta separada , para ficar mais seguro.

O arquivo de banco de dados deve pertencer a www-data

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

Meu operador operacional recebe um membro do grupo www-data:

sudo usermod -a -G www-data hape

Permitir acesso de gravação do arquivo de banco de dados aos membros do 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, o banco de dados pode ser acessado como read + write pelo apache2-daemon (usuário www-data), sem conceder a pasta raiz do projeto, e - por outro lado - o aplicativo pode ser executado no modo dev pelo usuário operacional hape, por exemplo

./manage.py runserver

também.

    
por 14.04.2013 / 12:22
1

Emprestado pela pergunta SO: link

Supondo que os arquivos sejam de propriedade do usuário do apache, inicie:

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

defina ACLs para o usuário / 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

Você pode dizer que há um ACL com ls -l , o '+' à direita nos bits das permissões:

# 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
    
por 04.01.2013 / 13:22
1

The solution is to make sure the directory containing the database file also has write access allowed to the process.

Para o Windows 7, 8.1, 10, Server 2012, etc., siga as instruções de instalação do Bonobo :

Permitir que o usuário do IIS modifique     Pasta C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data.

Para fazer isso:

  1. selecione Propriedades da pasta App_Data,
  2. vá para a guia Segurança,
  3. clique em editar,
  4. selecione o usuário do IIS (no meu caso IIS_IUSRS) e adicione a permissão Modificar e gravar,
  5. confirme estas configurações com o botão Aplicar.
por 11.11.2015 / 20:23
0

O servidor de desenvolvimento precisa ser executado como o mesmo usuário que tem write perms na pasta do banco de dados, portanto, se você originalmente criou o banco de dados como root, será necessário ser root quando executar:

python manage.py runserver
    
por 19.12.2011 / 09:35
0

crie um subdiretório no diretório de trabalho

mkdir db-folder 

crie um banco de dados sqlite no subdiretório

sqlite3 db-folder/db.db

altere o proprietário do subdiretório para www-data em debain ou apache em centOS

chown -R www-data db-folder

e pegue uma cerveja gelada porque você está pronto.

P / S: para verificar se o procedimento foi bem sucedido

ls -l data-folder

você deve ver isso

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder
    
por 17.06.2014 / 22:49
-1

apenas escreva sudo sqlite3 databaseFilename.sql e o trabalho

    
por 03.01.2017 / 07:21