Mengapa saya mendapatkan kesalahan sqlite, “tidak dapat membuka file database”?

65

Menggunakan aplikasi Django saya, saya bisa membaca dari database dengan baik. Ketika aplikasi tidak memiliki izin untuk mengakses file, itu memberi saya kesalahan ini:

mencoba untuk menulis database hanya baca

Itu masuk akal. Jadi saya mengedit izin pada file tersebut, sehingga proses Apache memiliki izin menulis. Namun, alih-alih bisa menulis, saya mendapatkan kesalahan samar ini:

tidak dapat membuka file database

Jika ini berguna, inilah keseluruhan hasilnya:

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

Beri tahu saya jika ada jejak stack yang diperlukan.

Nick Bolton
sumber
Sepertinya Anda mendapatkan masalah ini saat Anda menggunakan.
Mohammed Shareef C

Jawaban:

79

Aha, baru saja menemukan artikel yang menjelaskan hal ini. Juga Django punya info di halaman NewbieMistakes mereka .

Solusinya adalah memastikan direktori yang berisi file database juga memiliki akses tulis yang diizinkan untuk proses.

Dalam kasus saya, menjalankan perintah ini memperbaiki masalah:

sudo chown www-data .
Nick Bolton
sumber
3
Ini mengasumsikan Anda menggunakan debian / ubuntu, jika Anda menggunakan CentOS, Anda akan ingin menggunakan 'apache' alih-alih 'www-data'
Luke Chadwick
3
@nbolton Catatan: chown www-data. .sebenarnya harus chown www-data .ada kalau tidak ada beberapa perintah chown yang tidak saya ketahui ... tolong beri tahu saya.
Jeff Sheffield
3
Saya percaya titik ekstra adalah mengatur grup ke grup default pemilik. Kalau tidak, itu tidak mengubah grup. Ini hanya dari ingatan, saya sangat menyarankan Anda mencobanya sendiri.
Nick Bolton
Dirangkum di sini dalam kasus pembusukan tautan di masa mendatang atau tl; dr: SQLite3 ingin akses tulis ke direktori file DB sehingga dapat membuat file jurnal di sana saat transaksi dibuka.
user1454265
Bagus untuk pengguna Linux. Bupkiss untuk Windows.
Jay Blanchard
7

Solusi saya untuk ini lebih seperti itu. Saya tidak benar-benar ingin mengubah kepemilikan dir ini. (kebanyakan karena saya menggunakan pengguna pi untuk melakukan hal-hal seperti git)

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

(atau db apa pun yang Anda gunakan)

di mana pi adalah pengguna yang saya buat semua file masuk (ya ini adalah raspberry pi)

Alih-alih mengubah izin menjadi www-data, saya menemukan bahwa saya hanya perlu mengubah izin seperti ini:

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

Ini memberi akses tulis grup ke file yang diperlukan dan menambahkan pengguna data-www ke grup pi.

Catatan: jika Anda telah login, Anda perlu melakukan ini juga untuk file log django atau apache tidak akan menyukainya.

SpiRail
sumber
1
Saya pikir Anda bisa saja menambahkan pengguna pi ke grup www-data juga. Anda juga bisa saja meninggalkan file apa adanya dan menggunakan perintah setfacl untuk menambahkan daftar kontrol akses untuk pi pada file dan atau direktori.
slm
setfacl terdengar seperti opsi yang berpotensi bagus. Akan lebih baik untuk memiliki ini terdaftar sebagai jawaban instruksional. Satu masalah yang saya hadapi adalah bahwa saya perlu menghapus file .db sering dalam pengujian. Ketika itu akan diciptakan kembali, itu perlu dicacah lagi.
SpiRail
Lihat jawaban saya untuk pertanyaan ini, serverfault.com/a/462970/2518 . Apakah ada sesuatu yang lebih yang harus saya tambahkan untuk membantu?
slm
7

Dari Django mengatakan "Tidak dapat Buka File Database" ketika menggunakan SQLite3 bagian dari kesalahan Newbie wiki Django halaman :

  1. pastikan Apache juga dapat menulis ke direktori induk dari database
  2. pastikan tidak ada folder dari path lengkap file database dimulai dengan angka
  3. pastikan path lengkap dbdirektori tersebut ada
  4. pastikan /tmpdirektori Anda bisa ditulis oleh dunia
  5. pastikan path ke database yang ditentukan dalam settings.pyadalah path lengkap
  6. pastikan tidak ada karakter khusus di jalur
  7. pada Windows, pastikan jalur direktori db ditulis dengan serangan balik ganda
ssc
sumber
Salin / rekatkan bagian tautan yang relevan di sini.
Christophe De Troyer
Dan itu adalah suara positif! :)
Christophe De Troyer
5

Menambahkan pengguna operasional ke grup data-www berfungsi dengan baik di lingkungan pengujian saya. Selain itu saya telah memasukkan file sqlite3.db ke dalam subfolder terpisah , agar lebih aman.

File basis data harus dimiliki oleh www-data

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

Hape pengguna operasional saya mendapat anggota grup data-www:

sudo usermod -a -G www-data hape

Izinkan akses tulis file database ke anggota grup 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

Akibatnya, database dapat diakses baca + tulis oleh apache2-daemon (pengguna www-data), tanpa memberikan hibah ke folder root proyek, dan - di sisi lain - aplikasi dapat dijalankan dalam mode dev oleh operasional pengguna hape, mis

./manage.py runserver

juga.

Hartmut P.
sumber
1

Dipinjam dari pertanyaan SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Dengan asumsi file dimiliki oleh pengguna apache untuk memulai:

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

ditetapkan ACLsuntuk pi pengguna / grup:

% 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

Anda dapat mengetahui ada tanda ACLwith ls -l, '+' pada bit izin:

# 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
sumber
Mengatur pemilik / grup ke proses apache untuk seluruh proyek Django adalah ide yang buruk, tidak perlu memberikan hak istimewa yang tidak perlu.
benjaoming
1

Solusinya adalah memastikan direktori yang berisi file database juga memiliki akses tulis yang diizinkan untuk proses.

Untuk Windows 7, 8.1, 10, Server 2012, dll. Ikuti petunjuk instalasi Bonobo :

Izinkan Pengguna IIS untuk memodifikasi folder C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data.

Untuk melakukannya:

  1. pilih Properties dari folder App_Data,
  2. pergi ke tab Security,
  3. klik edit,
  4. pilih pengguna IIS (dalam kasus saya IIS_IUSRS) dan tambahkan Modifikasi dan Tulis izin,
  5. konfirmasi pengaturan ini dengan tombol Terapkan.
DEXTER360
sumber
0

Server pengembangan harus dijalankan sebagai pengguna yang sama yang memiliki izin menulis pada folder basis data, jadi jika Anda awalnya membuat basis data sebagai root, Anda harus melakukan root ketika menjalankan:

python manage.py runserver
Kilizo
sumber
Meskipun secara teknis benar, menjalankan server sebagai rootadalah mengerikan ide - Akan lebih baik untuk chowndatabase ke user biasa biasa yang biasanya berjalan server ...
voretaq7
0

buat subdirektori di direktori kerja

mkdir db-folder 

buat database sqlite di subdirektori

sqlite3 db-folder/db.db

ubah pemilik untuk subdirektori ke www-data dalam debain atau apache dalam centOS

chown -R www-data db-folder

dan ambil bir dingin karena Anda sudah selesai.

P / S: untuk memeriksa apakah prosedurnya berhasil

ls -l data-folder

Anda harus melihat itu

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder
brotich
sumber
Jika Anda akan memposting jawaban, berikan jawaban yang jauh berbeda dengan jawaban lain pada pertanyaan yang sama.
masegaloeh
-1

hanya menulis sudo sqlite3 databaseFilename.sqldan itu berhasil

alireza
sumber
Itu mungkin bekerja untuk sesi pengguna interaktif tetapi bukan solusi bukan untuk aplikasi web ...
HBruijn