it-swarm-vi.tech

Tại sao tôi gặp lỗi sqlite, "không thể mở tệp cơ sở dữ liệu"?

Sử dụng ứng dụng Django của tôi, tôi có thể đọc từ cơ sở dữ liệu tốt. Khi ứng dụng không có quyền truy cập tệp, nó đã báo lỗi cho tôi:

cố gắng viết một cơ sở dữ liệu chỉ đọc

Mà có ý nghĩa. Vì vậy, tôi đã chỉnh sửa các quyền trên tệp để quy trình Apache có quyền ghi. Tuy nhiên, thay vì có thể viết, tôi gặp lỗi khó hiểu này:

không thể mở tập tin cơ sở dữ liệu

Nếu nó hữu ích, đây là toàn bộ đầu ra:

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

Hãy cho tôi biết nếu một dấu vết ngăn xếp là cần thiết.

65
Nick Bolton

Aha, tình cờ gặp một bài báo giải thích điều này. Ngoài ra Django có thông tin trên trang NewbieMistakes .

Giải pháp là đảm bảo thư mục chứa tệp cơ sở dữ liệu cũng có quyền truy cập ghi được cho phép vào quy trình.

Trong trường hợp của tôi, chạy lệnh này đã khắc phục sự cố:

Sudo chown www-data .
80
Nick Bolton

Giải pháp của tôi cho vấn đề này là như vậy hơn. Tôi không thực sự muốn thay đổi quyền sở hữu của thư mục này. (chủ yếu là vì tôi sử dụng người dùng pi để làm những việc như git)

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

(hoặc bất cứ db nào bạn đang sử dụng)

trong đó pi là người dùng mà tôi đã tạo tất cả các tệp. (vâng, đây là Raspberry Pi)

Thay vì thay đổi quyền thành dữ liệu www, tôi thấy rằng tôi chỉ cần thay đổi các quyền như thế này:

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

Điều này cho phép nhóm ghi quyền truy cập vào các tệp cần thiết và thêm người dùng dữ liệu www vào nhóm pi.

Lưu ý: nếu bạn đã đăng nhập, bạn sẽ cần phải làm điều này cho logfile Django hoặc Apache sẽ không thích nó nhiều.

7
SpiRail

Từ Django nói "Không thể mở tệp cơ sở dữ liệu" khi sử dụng SQLite3 phần của Lỗi người mới Django wiki trang :

  1. đảm bảo Apache cũng có thể ghi vào thư mục mẹ của cơ sở dữ liệu
  2. đảm bảo không có thư mục nào trong đường dẫn đầy đủ của tệp cơ sở dữ liệu bắt đầu bằng một số
  3. đảm bảo đường dẫn đầy đủ thư mục db không tồn tại
  4. đảm bảo thư mục /tmp của bạn có thể ghi trên thế giới
  5. đảm bảo đường dẫn đến cơ sở dữ liệu được chỉ định trong settings.py là đường dẫn đầy đủ
  6. đảm bảo không có ký tự đặc biệt nào trên đường dẫn
  7. trên Windows, hãy đảm bảo đường dẫn thư mục db được viết bằng dấu hai lần
7
ssc

Thêm người dùng hoạt động vào nhóm dữ liệu www đang hoạt động tốt trên môi trường thử nghiệm của tôi. Ngoài ra, tôi đã đặt tệp sqlite3.db vào một thư mục con riêng biệt , để an toàn hơn.

Tệp cơ sở dữ liệu sẽ được sở hữu bởi dữ liệu www

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

Hape người dùng hoạt động của tôi có được một thành viên của nhóm dữ liệu www:

Sudo usermod -a -G www-data hape

Cho phép tệp cơ sở dữ liệu truy cập ghi vào các thành viên của dữ liệu www nhóm:

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

Kết quả là, cơ sở dữ liệu có thể được truy cập đọc + ghi bởi Apache2-daemon (dữ liệu www của người dùng), mà không cấp quyền cho thư mục gốc của dự án và - mặt khác - ứng dụng có thể được chạy trong chế độ dev bởi hoạt động hape người dùng, vd.

./manage.py runserver

cũng thế.

5
Hartmut P.

Mượn từ SO câu hỏi: https://stackoverflow.com/questions/4283132/Apache-instance-user- allow- phát hành

Giả sử các tệp được sở hữu bởi người dùng Apache để bắt đầu:

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

đặt ACLs cho người dùng/nhóm 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

Bạn có thể nói có ACL với ls -l, dấu '+' trên các bit quyền:

# 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
slm

Giải pháp là đảm bảo thư mục chứa tệp cơ sở dữ liệu cũng có quyền truy cập ghi được cho phép vào quy trình.

Đối với Windows 7, 8.1, 10, Server 2012, v.v ... hãy làm theo hướng dẫn cài đặt Bonobo :

Cho phép IIS Người dùng sửa đổi thư mục C:\inetpub\wwwroot\Bonobo.Git.Server\App_Data.

Làm như vậy:

  1. chọn Thuộc tính của thư mục App_Data,
  2. đi tới tab Bảo mật,
  3. nhấp vào chỉnh sửa,
  4. chọn IIS người dùng (trong trường hợp của tôi là IIS_IUSRS) và thêm quyền Sửa đổi và Viết,
  5. xác nhận các cài đặt này bằng nút Áp dụng.
1
DEXTER360

Máy chủ phát triển cần được chạy như cùng một người dùng đã viết perm trên thư mục cơ sở dữ liệu, vì vậy nếu ban đầu bạn tạo cơ sở dữ liệu dưới dạng root, bạn sẽ cần phải root khi chạy:

python manage.py runserver
0
Kilizo

tạo một thư mục con trong thư mục làm việc

mkdir db-folder 

tạo cơ sở dữ liệu sqlite trong thư mục con

sqlite3 db-folder/db.db

thay đổi chủ sở hữu cho thư mục con thành dữ liệu www đang bị tranh cãi hoặc Apache trong centOS

chown -R www-data db-folder

và lấy một cốc bia lạnh vì bạn đã làm xong.

P/S: để kiểm tra xem thủ tục có thành công không

ls -l data-folder

bạn sẽ thấy như vậy

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