Vraag Waarom krijg ik een sqlite-foutmelding, "kan databasebestand niet openen"?


Met behulp van mijn Django-app kan ik prima uit de database lezen. Toen de toepassing geen toegang had tot het bestand, kreeg ik de volgende foutmelding:

poging om een ​​readonly database te schrijven

Wat was logisch. Dus ik heb de rechten op het bestand bewerkt, zodat het Apache-proces schrijfrechten had. In plaats van te kunnen schrijven, krijg ik echter de volgende cryptische foutmelding:

kan databasebestand niet openen

Als het nuttig is, hier is de volledige uitvoer:

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

Laat me weten of een stacktracering nodig is.


61
2017-08-23 12:08


oorsprong


Het denkt dat je dit probleem hebt gehad toen je aan het deployen was. - Mohammed Shareef C


antwoorden:


Aha, struikelde gewoon een artikel dit uitleggen. Django heeft ook info over hun NewbieMistakes pagina.

De oplossing is om ervoor te zorgen dat de map die het databasebestand bevat ook schrijftoegang heeft voor het proces.

In mijn geval heeft het uitvoeren van deze opdracht het probleem opgelost:

sudo chown www-data .

76
2017-08-23 12:14



Dit veronderstelt dat je op debian / ubuntu zit, als je CentOS gebruikt, wil je 'apache' gebruiken in plaats van 'www-data' - Luke Chadwick
@nbolton Opmerking: chown www-data. . zou eigenlijk moeten zijn chown www-data . anders is er wat tovenarij van het commando chown waar ik niets van weet ... informeer me alsjeblieft. - Jeff Sheffield
Ik geloof dat de extra punt is om de groep in de standaardgroep van de eigenaar in te stellen. Anders verandert het de groep niet. Dit is echter alleen uit het geheugen, ik raad je aan om dat zelf uit te proberen. - Nick Bolton
Hier samengevat in het geval van toekomstige linkrot of tl; dr: SQLite3 wil schrijftoegang tot de map van het DB-bestand zodat het daar een journaalbestand kan maken wanneer een transactie wordt geopend. - user1454265
Geweldig voor Linux-gebruikers. Bupkiss voor Windows. - Jay Blanchard


Van de Django zegt: "Databasebestand kan niet worden geopend" bij gebruik van SQLite3  sectie van de Beginner fouten Django-wiki pagina:

  1. zorg ervoor dat Apache ook naar de bovenliggende directory van de database kan schrijven
  2. zorg ervoor dat geen van de mappen van het volledige pad van het databasebestand begint met een nummer
  3. zorg ervoor dat het volledige pad de db map bestaat
  4. zorg ervoor dat je /tmp map is wereldwijd schrijfbaar
  5. zorg ervoor dat het pad naar de database is opgegeven in settings.py is een volledig pad
  6. zorg ervoor dat er geen speciale tekens in het pad staan
  7. in Windows, zorg ervoor dat het db-mappad met dubbele backlashes is geschreven

6
2018-01-14 22:43



Kopieer en plak de relevante delen van de link hier. - Christophe De Troyer
En het is een upvote! :) - Christophe De Troyer


Mijn oplossing hiervoor was meer zo. Ik wilde het eigendom van deze map niet echt veranderen. (meestal omdat ik de pi-gebruiker gebruik om dingen als git te doen)

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

(of wat db je ook gebruikt)

waar pi de gebruiker is waar ik alle bestanden in heb gemaakt. (ja dit is een raspberry pi)

In plaats van het wijzigen van machtigingen voor www-gegevens, ontdekte ik dat ik alleen de machtigingen op deze manier hoefde te wijzigen:

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

Hierdoor krijgt de groep schrijfrechten voor de benodigde bestanden en wordt de gebruiker van www-gegevens toegevoegd aan de pi-groep.

Opmerking: als u een logboekregistratie hebt, moet u dit ook doen voor het django-logbestand, anders zal apache het niet leuk vinden.


5
2018-01-02 23:08



Ik denk dat je de pi-gebruiker net ook aan de www-datagroep had kunnen toevoegen. Ook had je de bestanden net kunnen verlaten zoals ze zijn en heb je de opdracht setfacl gebruikt om een ​​toegangscontrolelijst toe te voegen voor pi op de bestanden en of mappen. - slm
setfacl klinkt als een potentieel goede optie. Het zou goed zijn om dit als instructief antwoord te hebben. Een probleem waar ik voor sta, is dat ik het DBB-bestand vaak moet verwijderen tijdens het testen. Wanneer het wordt nagebootst, moet het opnieuw worden herkauwd. - SpiRail
Zie mijn antwoord voor deze vraag, serverfault.com/a/462970/2518. Is er iets meer dat ik zou moeten toevoegen aan wat zou kunnen helpen? - slm


Het toevoegen van een operationele gebruiker aan de www-gegevensgroep werkt goed in mijn testomgeving. Bovendien heb ik het bestand sqlite3.db in een afzonderlijke map geplaatst submap, om veiliger te zijn.

Het databasebestand moet eigendom zijn van www-data

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

Mijn operationele gebruikershape krijgt een lid van de www-gegevensgroep:

sudo usermod -a -G www-data hape

Schrijven toegang tot het databasebestand toestaan ​​aan leden van groep 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

Als gevolg hiervan heeft de database toegang tot read + write door apache2-daemon (gebruiker www-data), zonder subsidie ​​te verlenen aan de hoofdmap van het project en - aan de andere kant - kan de app in de dev-modus worden uitgevoerd door de operationele gebruiker hape, bijv

./manage.py runserver

ook.


5
2018-04-14 12:22





Geleend van SO vraag: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Aangenomen dat de bestanden eigendom zijn van de apache-gebruiker om te starten:

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

reeks ACLs voor gebruiker / groep 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

Je kunt zien dat er een is ACL met ls -l, de trailing '+' op de machtigingsbits:

# 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

1
2018-01-04 13:22



De eigenaar / groep instellen op het apache-proces voor het hele django-project is een slecht idee, geen onnodige privileges. - benjaoming


De oplossing is om ervoor te zorgen dat de map die het databasebestand bevat ook schrijftoegang heeft voor het proces.

Voor ramen 7, 8.1, 10, Server 2012, enz. Volg de Bonobo installatie-instructies:

IIS-gebruiker toestaan ​​te wijzigen     C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data map. 

Om dit te doen:

  1. selecteer Eigenschappen van de map App_Data,
  2. ga naar het tabblad Beveiliging,
  3. klik op bewerken,
  4. selecteer IIS-gebruiker (in mijn geval IIS_IUSRS) en voeg wijzigings- en schrijfrechten toe,
  5. bevestig deze instellingen met de knop Toepassen.

1
2017-11-11 20:23





De ontwikkelingsserver moet worden uitgevoerd als dezelfde gebruiker met schrijfpermissies voor de databasemap, dus als u de database oorspronkelijk als root hebt gemaakt, moet u root zijn wanneer u het volgende uitvoert:

python manage.py runserver

0
2017-12-19 09:35



Hoewel technisch correct, draait de server als root is een vreselijk idee - Het zou beter zijn om chown de database voor de normale onbevoegde gebruiker die normaal de server draait ... - voretaq7


maak een submap aan in de werkmap

mkdir db-folder 

maak sqlite-database aan in de onderafdeling

sqlite3 db-folder/db.db

verander eigenaar voor de subdirectory naar www-data in debain of apache in centOS

chown -R www-data db-folder

en pak een koud biertje als je klaar bent.

P / S: om te controleren of de procedure succesvol was

ls -l data-folder

je zou dit moeten zien

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

0
2018-06-17 22:49



Als u een antwoord wilt plaatsen, geeft u het antwoord op dat wezenlijk verschilt van de andere antwoorden op dezelfde vraag. - masegaloeh


Schrijf gewoon sudo sqlite3 databaseFilename.sql en het is werk


-1
2018-01-03 07:21



Dat zou kunnen werken voor een interactieve gebruikerssessie, maar is niet de oplossing niet voor een webapplicatie ... - HBruijn