Por que eu recebo o erro sqlite, "incapaz de abrir o arquivo do banco de dados"?

65

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

tentar escrever um banco de dados somente leitura

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

incapaz de abrir o arquivo de banco de dados

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

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.

Nick Bolton
fonte
Ele acha que você teve esse problema quando estava implantando.
Mohammed Shareef C

Respostas:

79

Aha, apenas tropeçou em um artigo explicando isso. O Django também tem informações na 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, executar este comando corrigiu o problema:

sudo chown www-data .
Nick Bolton
fonte
3
Isso pressupõe que você está no Debian / Ubuntu, se você estiver usando CentOS você vai querer usar 'apache' em vez de 'www-data'
Luke Chadwick
3
@nbolton Nota: chown www-data. .na verdade, deve ser de chown www-data .outra forma, existe algum comando mágico de chown que eu não conheço ... por favor, me esclareça.
Jeff Sheffield
3
Acredito que o ponto extra é definir o grupo para o grupo padrão do proprietário. Caso contrário, isso não muda o grupo. Porém, isso é apenas da memória, eu recomendo que você tente isso sozinho.
Nick Bolton
Resumido aqui em caso de roteamento futuro de link ou tl; dr: SQLite3 deseja acesso de gravação ao diretório do arquivo DB, para que ele possa criar um arquivo de diário quando uma transação for aberta.
user1454265
Ótimo para usuários de Linux. Bupkiss para Windows.
Jay Blanchard
7

Minha solução para isso foi mais assim. Eu realmente não queria mudar a propriedade desse 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 que seja o db que você esteja usando)

onde pi é o usuário em que criei todos os arquivos. (sim, este é um raspberry pi)

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

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

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

Nota: se você tiver log, precisará fazer isso também para o arquivo de log do django ou o apache não gostará muito.

SpiRail
fonte
11
Eu acho que você também poderia ter adicionado o usuário pi ao grupo www-data. Além disso, você pode ter deixado os arquivos como estão e usado o comando setfacl para adicionar uma lista de controle de acesso para pi nos arquivos e diretórios.
SLM
setfacl soa como uma opção potencialmente boa. Seria bom ter isso listado como uma resposta instrucional. Um problema que enfrento é que preciso excluir o arquivo .db frequentemente nos testes. Quando é recriado, precisa ser repetido novamente.
SpiRail
Veja minha resposta para esta pergunta, serverfault.com/a/462970/2518 . Há algo mais que devo acrescentar àquilo que ajudaria?
Slm
7

Desde o Django diz "Não é possível abrir o arquivo de banco de dados" ao usar SQLite3 seção da erros Novato wiki Django página :

  1. verifique se o Apache também pode gravar no diretório pai do banco de dados
  2. verifique se nenhuma das pastas do caminho completo do arquivo de banco de dados começa com um número
  3. verifique se o caminho completo do dbdiretório existe
  4. verifique se o seu /tmpdiretório é gravável no mundo
  5. verifique se o caminho para o banco de dados especificado 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á gravado com barras duplas
ssc
fonte
Copie / cole as partes relevantes do link aqui.
21416 Christophe De Troyer
E é um voto positivo! :)
Christophe De Troyer
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 ser 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 hape de usuário operacional obtém 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 leitura + gravação pelo apache2-daemon (usuário www-data), sem conceder permissão à pasta raiz do projeto e - por outro lado - o aplicativo pode ser executado no modo dev pelo operacional hape de usuário, por exemplo

./manage.py runserver

Além disso.

Hartmut P.
fonte
1

Emprestado da pergunta SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Assumindo que os arquivos pertencem ao usuário apache para iniciar:

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

definido ACLspara 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 ACLcom ls -l, o '+' à direita nos bits de permissão:

# 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
slm
fonte
Definir o proprietário / grupo para o processo apache para todo o projeto django é uma má idéia, não é necessário conceder privilégios desnecessários.
21413 benjaoming
1

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.

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

Permita que o usuário do IIS modifique a 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 usuário do IIS (no meu caso, IIS_IUSRS) e adicione a permissão Modify and Write,
  5. confirme essas configurações com o botão Aplicar.
DEXTER360
fonte
0

O servidor de desenvolvimento precisa ser executado como o mesmo usuário que possui permissões de gravação na pasta do banco de dados; portanto, se você originalmente criou o banco de dados como raiz, será necessário ser root quando executar:

python manage.py runserver
Kilizo
fonte
Embora tecnicamente correta, executando o servidor como rooté uma terrível ideia - Seria melhor para chowno banco de dados para o usuário sem privilégios regular que normalmente é executado o servidor ...
voretaq7
0

crie um subdiretório no diretório de trabalho

mkdir db-folder 

criar banco de dados sqlite no subdiretório

sqlite3 db-folder/db.db

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

chown -R www-data db-folder

e tome uma cerveja gelada porque está pronto.

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

ls -l data-folder

você deveria ver tal

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder
Brotich
fonte
Se você postar uma resposta, forneça uma resposta substancialmente diferente das outras respostas na mesma pergunta.
masegaloeh
-1

basta escrever sudo sqlite3 databaseFilename.sqle é trabalho

alireza
fonte
Isso pode funcionar para uma sessão de usuário interativa, mas não é a solução e não para uma aplicação web ...
HBruijn