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


65

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.


Nó nghĩ rằng bạn có vấn đề này khi bạn đang triển khai.
Mohammed Shareef C

Câu trả lời:


79

Aha, tình cờ thấy 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 của họ .

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 .

3
Điều này giả sử bạn đang sử dụng debian / ubfox, nếu bạn đang sử dụng CentOS, bạn sẽ muốn sử dụng 'apache' thay vì 'www-data'
Luke Chadwick

3
@nbolton Lưu ý: chown www-data. .thực sự nên chown www-data .có một số lệnh chown mà tôi không biết ... xin hãy khai sáng cho tôi.
Jeff Sheffield

3
Tôi tin rằng dấu chấm bổ sung là đặt nhóm thành nhóm mặc định của chủ sở hữu. Nếu không, nó không thay đổi nhóm. Đây chỉ là từ bộ nhớ, tôi khuyên bạn nên tự mình thử nó.
Nick Bolton

Tóm tắt ở đây trong trường hợp tương lai bị thối hoặc tl; dr: SQLite3 muốn truy cập ghi vào thư mục của tệp DB để nó có thể tạo tệp nhật ký ở đó khi giao dịch được mở.
dùng1454265

Tuyệt vời cho người dùng Linux. Bupkiss cho Windows.
Jay Blanchard

7

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 trong. (vâng đây là một mâm xôi 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 cũng 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.


1
Tôi nghĩ bạn cũng có thể đã thêm người dùng pi vào nhóm dữ liệu www. Ngoài ra, bạn có thể vừa rời khỏi các tệp như hiện tại và sử dụng lệnh setfacl để thêm danh sách kiểm soát truy cập cho pi trên các tệp và thư mục.
slm

setfacl nghe có vẻ như là một lựa chọn tốt. Nó sẽ là tốt để có được liệt kê như là một câu trả lời hướng dẫn. Một vấn đề tôi gặp phải là tôi cần phải xóa tệp .db thường xuyên trong quá trình kiểm tra. Khi nó được tái tạo, nó cần phải được bắt đầu lại.
SpiRail

Xem câu trả lời của tôi cho câu hỏi này, serverfault.com/a/462970/2518 . Có một cái gì đó nhiều hơn tôi nên thêm vào đó sẽ giúp đỡ?
slm

7

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

  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 đủ mà dbthư mục tồn tại
  4. đảm bảo /tmpthư mục của bạn có thể ghi được
  5. đảm bảo đường dẫn đến cơ sở dữ liệu được chỉ định trong settings.pylà một đườ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 các dấu hai lần

Sao chép / dán các phần có liên quan của liên kết ở đây.
Barshe De Troyer

Và nó là một upvote! :)
Barshe De Troyer

5

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ế.


1

Mượn từ câu hỏi SO: https://stackoverflow.com/questions/4283132/apache-instance-user- allow-su

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

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

đặt ACLscho 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 đó là một ACLvới ls -l, các dấu '+' trên các bit cho phép:

# 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 chủ sở hữu / nhóm vào quy trình apache cho toàn bộ dự án django là một ý tưởng tồi, không cần phải cung cấp các đặc quyền không cần thiết.
benjaoming

1

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 người dùng IIS 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 người dùng IIS (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.

0

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

Mặc dù về mặt kỹ thuật, việc chạy máy chủ rootlà một ý tưởng tồi tệ - Sẽ tốt hơn cho chowncơ sở dữ liệu cho người dùng không có đặc quyền thường chạy máy chủ ...
voretaq7

0

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 trong tranh luận 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

Nếu bạn định đăng câu trả lời, vui lòng cung cấp câu trả lời khác biệt đáng kể với các câu trả lời khác cho cùng một câu hỏi.
masegaloeh

-1

chỉ cần viết sudo sqlite3 databaseFilename.sqlvà nó hoạt động


Điều đó có thể hoạt động cho phiên người dùng tương tác nhưng không phải là giải pháp không dành cho ứng dụng web ...
HBruijn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.