Neden “veritabanı dosyası açılamıyor” sqlite hatası alıyorum?


65

Benim Django uygulamasını kullanarak, veritabanından sadece iyi okuyabilirim. Uygulama dosyaya erişme iznine sahip olmadığında, bana şu hatayı verdi:

salt okunur bir veritabanı yazmaya çalışmak

Hangi mantıklı. Böylece dosyadaki izinleri değiştirdim, böylece Apache işleminin yazma izinleri vardı. Bununla birlikte, yazmak yerine, bu şifreli hatayı alıyorum:

veritabanı dosyası açılamıyor

İşe yararsa, işte bütün çıktı:

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

Yığın izi gerekliyse bana bildirin.


Konuşlandırırken bu sorunu yaşadığını düşünüyorum.
Mohammed Shareef C

Yanıtlar:


79

Aha, bunu açıklayan bir yazıya rastladım . Ayrıca Django NewbieMistakes sayfasında bilgi sahibi olur.

Çözüm, veritabanı dosyasını içeren dizinin işlem için izin verilen yazma erişimine sahip olduğundan emin olmaktır.

Benim durumumda, bu komutu çalıştırmak sorunu düzeltti:

sudo chown www-data .

3
Bu, debian / ubuntu'da olduğunuzu varsayar, CentOS kullanıyorsanız, 'www-data' yerine 'apache' kullanmak isteyeceksinizdir
Luke Chadwick

3
@ Notbol: chown www-data. .aslında chown www-data .aksi halde bilmem gereken bazı chown komut sihirbazı olmalı ... lütfen beni aydınlat.
Jeff Sheffield,

3
Ekstra noktanın grubu sahibinin varsayılan grubuna ayarlamak olduğuna inanıyorum. Aksi takdirde grubu değiştirmez. Bu sadece hafızada olsa da, bunu kendiniz denemenizi tavsiye ederim.
Nick Bolton

Gelecekteki link rot ya da tl durumunda burada özetlenir; dr: SQLite3, bir işlem açıldığında orada bir günlük dosyası oluşturabilmesi için DB dosyasının dizinine yazma erişimi ister.
user1454265

Linux kullanıcıları için harika. Windows için Bupkiss.
Jay Blanchard,

7

Buna olan çözümüm daha çok gibiydi. Gerçekten bu dir'in sahipliğini değiştirmek istemedim. (çoğunlukla pi kullanıcısını git gibi şeyler yapmak için kullandığım için)

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

(veya ne kullanıyorsanız kullanın)

pi tüm dosyaları oluşturduğum kullanıcı. (evet bu ahududu pi)

İzinleri www-data olarak değiştirmek yerine, sadece bu gibi izinleri değiştirmem gerektiğini öğrendim:

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

Bu, gerekli dosyalara gruba yazma erişimi sağlar ve www-data kullanıcısını pi grubuna ekler.

Not: Günlük kaydınız varsa, bunu django günlük dosyası için de yapmanız gerekir, aksi halde apache bundan hoşlanmayacaktır.


1
Bence pi kullanıcısını www-data grubuna da ekleyebilirdin. Ayrıca dosyaları olduğu gibi bırakmış olabilirsiniz ve setfacl komutunu dosyalar ve dizinler üzerinde bir erişim kontrolü listesi eklemek için kullanabilirsiniz.
slm

setfacl potansiyel olarak iyi bir seçenek gibi geliyor. Bunun bir öğretim cevabı olarak sıralanması iyi olur. Karşılaştığım tek sorun, test sırasında sık sık .db dosyasını silmem gerektiği. Yeniden yaratıldığında, tekrar boğulmaya ihtiyacı var.
SpiRail

Bu soruya cevabımı gör, serverfault.com/a/462970/2518 . Yardımcı olacak olana eklemem gereken bir şey var mı?
slm

7

Gönderen Django SQLite3 kullanırken "Veritabanı Dosya Açılamıyor" diyor bölümüne ait Çaylak hatalar Django wiki sayfasından :

  1. Apache'nin veritabanının ana dizinine de yazabildiğinden emin olun.
  2. veritabanı dosyasının tam yolundaki klasörlerin hiçbirinin bir sayıyla başlamadığından emin olun.
  3. dbdizinin var olduğu tam yoldan emin olun
  4. /tmpDizininizin dünya tarafından yazılabilir olduğundan emin olun
  5. belirtilen veritabanına settings.pygiden yolun tam yol olduğundan emin olun.
  6. Yolda özel karakter olmadığından emin olun
  7. Windows'ta db dizin yolunun çift boşluk ile yazıldığından emin olun.

Bağlantının ilgili kısımlarını buraya kopyalayın / yapıştırın.
Christophe De Troyer

Ve bu bir avantaj! :)
Christophe De Troyer

5

Operasyonel bir kullanıcıyı www-veri grubuna eklemek, test ortamımda iyi çalışıyor. Ayrıca sqlite3.db dosyasını daha güvenli olması için ayrı bir alt klasöre koydum .

Veri tabanı dosyası www-data'ya ait olmalıdır.

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

Operasyonel kullanıcı hape www-data grubunun bir üyesini alıyor:

sudo usermod -a -G www-data hape

Veri tabanı dosyasının grup www-data üyelerine erişimine izin ver:

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

Sonuç olarak, veritabanına apache2-daemon (user www-data) ile okuma + yazma, proje kök klasörüne hibe vermeden erişilebilir ve - diğer taraftan uygulama operasyonel tarafından dev modunda çalıştırılabilir. kullanıcı hape, örneğin

./manage.py runserver

Ayrıca.


1

SO sorusundan ödünç alındı: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Dosyaları başlatmak için apache kullanıcısına ait olduğunu varsayalım:

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

ACLskullanıcı / grup pi için ayarlanmış :

% 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

Bir var söyleyebilir ACLile ls -lsondaki '+' izinleri bit üzerinde,:

# 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

Tüm django projesi için sahibi / grubu apache işlemine ayarlamak gereksiz bir ayrıcalık vermeye gerek yok.
Şubat'ta

1

Çözüm, veritabanı dosyasını içeren dizinin işlem için izin verilen yazma erişimine sahip olduğundan emin olmaktır.

For Windows'un vb 7, 8.1, 10, Server 2012, izleyin Bonobo kurulum yönergeleri :

IIS Kullanıcısının C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data klasörünü değiştirmesine izin verin.

Böyle yaparak:

  1. App_Data klasörünün özelliklerini seçin,
  2. Güvenlik sekmesine gidin,
  3. düzenle'yi tıklayın
  4. IIS kullanıcısını seçin (benim durumumda IIS_IUSRS) ve Değiştir ve Yaz izni ekle,
  5. Bu ayarları Apply butonu ile onaylayın.

0

Geliştirme sunucusunun, veritabanı klasöründe yazma izinlerine sahip aynı kullanıcıyla çalıştırılması gerekir; bu nedenle, başlangıçta veritabanını kök olarak oluşturduysanız, çalıştırırken root olmanız gerekir:

python manage.py runserver

Teknik olarak doğru olsa da, sunucuyu korkunç bir fikir rootolduğu gibi çalıştırmak - Veritabanına normalde sunucuyu çalıştıran normal ayrıcalıklı bir kullanıcı için daha iyi olurdu ...chown
voretaq7

0

çalışma dizininde bir alt dizin oluşturun

mkdir db-folder 

alt bölümde sqlite veritabanı yarat

sqlite3 db-folder/db.db

Alt dizinin sahibini, borçlu olarak www-verisi veya centOS'taki apache olarak değiştir

chown -R www-data db-folder

ve bittiğinde soğuk bir bira alacağım.

P / S: prosedürün başarılı olup olmadığını kontrol etmek

ls -l data-folder

böyle görmelisin

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

Bir cevap gönderecekseniz, lütfen aynı sorudaki diğer cevaplardan oldukça farklı bir cevap verin.
masegaloeh

-1

sadece yaz sudo sqlite3 databaseFilename.sqlve işe yarıyor


Bu etkileşimli bir kullanıcı oturumu için işe yarayabilir, ancak bir web uygulaması için çözüm değildir ...
HBruijn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.