เหตุใดฉันจึงได้รับข้อผิดพลาด sqlite“ ไม่สามารถเปิดไฟล์ฐานข้อมูล” ได้


65

เมื่อใช้แอพ Django ของฉันฉันสามารถอ่านจากฐานข้อมูลได้ดี เมื่อแอปพลิเคชันไม่ได้รับอนุญาตให้เข้าถึงไฟล์มันทำให้ฉันมีข้อผิดพลาดนี้:

พยายามเขียนฐานข้อมูลแบบอ่านอย่างเดียว

ซึ่งทำให้รู้สึก ดังนั้นฉันจึงแก้ไขสิทธิ์ในไฟล์เพื่อให้กระบวนการ Apache มีสิทธิ์ในการเขียน อย่างไรก็ตามแทนที่จะเป็นความสามารถในการเขียนฉันได้รับข้อผิดพลาดลับนี้:

ไม่สามารถเปิดไฟล์ฐานข้อมูล

หากมีประโยชน์นี่คือผลลัพธ์ทั้งหมด:

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

แจ้งให้เราทราบหากจำเป็นต้องติดตามสแต็ก


มันคิดว่าคุณมีปัญหานี้เมื่อคุณปรับใช้
Mohammed Shareef C

คำตอบ:


79

อ้าเพิ่งสะดุดบทความที่อธิบายเรื่องนี้ Django ยังมีข้อมูลเกี่ยวกับหน้าNewbieMistakesของพวกเขา

วิธีแก้ไขคือทำให้แน่ใจว่าไดเรกทอรีที่มีไฟล์ฐานข้อมูลนั้นมีสิทธิ์การเขียนที่อนุญาตให้ดำเนินการ

ในกรณีของฉันการเรียกใช้คำสั่งนี้แก้ไขปัญหา:

sudo chown www-data .

3
สิ่งนี้ถือว่าคุณใช้เดเบียนหรืออูบุนตูถ้าคุณใช้ CentOS คุณจะต้องการใช้ 'apache' แทน 'www-data'
Luke Chadwick

3
@nbolton หมายเหตุ: chown www-data. .จริง ๆ แล้วควรเป็นchown www-data .อย่างอื่นมีบางคำสั่งของ chown ที่ฉันไม่รู้เกี่ยวกับ ... โปรดให้ความกระจ่างฉัน
Jeff Sheffield

3
ฉันเชื่อว่าจุดพิเศษคือการตั้งกลุ่มเป็นกลุ่มเริ่มต้นของเจ้าของ มิฉะนั้นจะไม่เปลี่ยนกลุ่ม นี่เป็นเพียงความทรงจำฉันขอแนะนำให้คุณลองด้วยตัวคุณเอง
Nick Bolton

สรุปที่นี่ในกรณีที่การเชื่อมโยงในอนาคตเน่าหรือ tl; dr: SQLite3 ต้องการเข้าถึงการเขียนไปยังไดเรกทอรีของไฟล์ DB เพื่อที่จะสามารถสร้างไฟล์เจอร์นัลที่นั่นเมื่อเปิดธุรกรรม
user1454265

เหมาะสำหรับผู้ใช้ Linux Bupkiss สำหรับ Windows
Jay Blanchard

7

วิธีการแก้ปัญหาของฉันในการนี ฉันไม่ต้องการเปลี่ยนความเป็นเจ้าของของคนนี้ (ส่วนใหญ่เป็นเพราะฉันใช้ผู้ใช้ pi ทำสิ่งต่าง ๆ เช่น git)

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

(หรือสิ่งที่คุณใช้ฐานข้อมูล)

โดยที่ pi คือผู้ใช้ที่ฉันสร้างไฟล์ทั้งหมด (ใช่นี่คือ raspberry pi)

แทนที่จะเปลี่ยนสิทธิ์เป็น www-data ฉันพบว่าฉันต้องการเปลี่ยนสิทธิ์เช่นนี้เท่านั้น:

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

สิ่งนี้ช่วยให้กลุ่มสามารถเข้าถึงไฟล์ที่จำเป็นและเพิ่มผู้ใช้ www-data ไปยังกลุ่ม pi

หมายเหตุ: หากคุณมีการบันทึกคุณจะต้องทำเช่นนี้สำหรับ django logfile เช่นกันหรือ apache จะไม่ชอบมาก


1
ฉันคิดว่าคุณสามารถเพิ่มผู้ใช้ pi ในกลุ่ม www-data ได้เช่นกัน นอกจากนี้คุณสามารถทิ้งไฟล์ไว้เหมือนเดิมและใช้คำสั่ง setfacl เพื่อเพิ่มรายการควบคุมการเข้าถึงสำหรับ pi บนไฟล์และหรือไดเรกทอรี
slm

setfacl ฟังดูเหมือนเป็นตัวเลือกที่ดี มันจะเป็นการดีถ้ามีรายการนี้เป็นคำตอบสำหรับการเรียนการสอน ปัญหาหนึ่งที่ฉันเผชิญคือฉันต้องลบไฟล์. db บ่อยครั้งในการทดสอบ เมื่อมันถูกสร้างขึ้นมาใหม่มันจะต้องถูกส่งเสียงอีกครั้ง
SpiRail

ดูคำตอบของฉันสำหรับคำถามนี้serverfault.com/a/462970/2518 มีอะไรอีกบ้างที่ฉันควรเพิ่มในสิ่งที่จะช่วย?
slm

7

จากDjango กล่าวว่า "ไม่สามารถเปิดไฟล์ฐานข้อมูล" เมื่อใช้ SQLite3 ส่วนของNewbie ผิดพลาด Django วิกิพีเดียหน้า :

  1. ตรวจสอบให้แน่ใจว่า Apache สามารถเขียนไปยังไดเรกทอรีหลักของฐานข้อมูล
  2. ตรวจสอบให้แน่ใจว่าไม่มีโฟลเดอร์ใดในพา ธ แบบเต็มของไฟล์ฐานข้อมูลเริ่มต้นด้วยตัวเลข
  3. ตรวจสอบให้แน่ใจว่าเส้นทางแบบเต็มdbไม่มีอยู่ในไดเรกทอรี
  4. ตรวจสอบให้แน่ใจว่า/tmpไดเรกทอรีของคุณเขียนได้ทั่วโลก
  5. ตรวจสอบให้แน่ใจว่าเส้นทางไปยังฐานข้อมูลที่ระบุsettings.pyเป็นเส้นทางแบบเต็ม
  6. ตรวจสอบให้แน่ใจว่าไม่มีอักขระพิเศษในเส้นทาง
  7. บน Windows ตรวจสอบให้แน่ใจว่าเส้นทางไดเรกทอรี db ถูกเขียนด้วย backlashes สองครั้ง

คัดลอก / วางส่วนที่เกี่ยวข้องของลิงค์ที่นี่
Christophe De Troyer

และมันก็เป็น upvote! :)
Christophe De Troyer

5

การเพิ่มผู้ใช้ในการปฏิบัติงานให้กับกลุ่ม www-data ทำงานได้ดีในสภาพแวดล้อมการทดสอบของฉัน นอกจากนี้ฉันได้วางไฟล์ sqlite3.db ลงในโฟลเดอร์ย่อยที่แยกต่างหากเพื่อความปลอดภัยมากขึ้น

ไฟล์ฐานข้อมูลจะต้องเป็นเจ้าของโดย www-data

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

ผู้ใช้ที่ปฏิบัติงานของฉันได้รับสมาชิกกลุ่ม www-data:

sudo usermod -a -G www-data hape

อนุญาตให้เข้าถึงไฟล์ฐานข้อมูลการเขียนสำหรับสมาชิกของกลุ่ม 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

เป็นผลให้สามารถเข้าถึงฐานข้อมูล read + write โดย apache2-daemon (ผู้ใช้ www-data) โดยไม่ต้องให้สิทธิ์กับโฟลเดอร์ root ของโครงการและ - ในทางกลับกัน - แอปสามารถทำงานในโหมด dev โดยผู้ปฏิบัติงาน ผู้ใช้ hape เช่น

./manage.py runserver

ด้วย


1

ยืมมาจากคำถาม SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

สมมติว่าไฟล์เป็นของผู้ใช้ apache เพื่อเริ่มต้น:

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

ชุดACLsสำหรับผู้ใช้ / กลุ่ม 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

คุณสามารถบอกได้มีการACLมีls -lการต่อท้าย '+' บนสิทธิ์บิต:

# 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

การตั้งค่าเจ้าของ / กลุ่มเป็นกระบวนการ apache สำหรับโครงการ django ทั้งหมดเป็นความคิดที่ดีไม่จำเป็นต้องให้สิทธิ์พิเศษที่ไม่จำเป็น
benjaoming

1

วิธีแก้ไขคือทำให้แน่ใจว่าไดเรกทอรีที่มีไฟล์ฐานข้อมูลนั้นมีสิทธิ์การเขียนที่อนุญาตให้ดำเนินการ

สำหรับWindows 7, 8.1, 10, Server 2012 ฯลฯ ทำตามคำแนะนำในการติดตั้ง Bonobo :

อนุญาตให้ผู้ใช้ IIS แก้ไขโฟลเดอร์ C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data

โดยทำดังนี้

  1. เลือกคุณสมบัติของโฟลเดอร์ App_Data
  2. ไปที่แท็บความปลอดภัย
  3. คลิกแก้ไข
  4. เลือกผู้ใช้ IIS (ในกรณีของฉัน IIS_IUSRS) และเพิ่มสิทธิ์ในการแก้ไขและเขียน
  5. ยืนยันการตั้งค่าเหล่านี้ด้วยปุ่มใช้

0

เซิร์ฟเวอร์การพัฒนาจำเป็นต้องถูกเรียกใช้ในฐานะผู้ใช้เดียวกันกับที่มีการเขียน perms ในโฟลเดอร์ฐานข้อมูลดังนั้นหากคุณสร้างฐานข้อมูลเป็น root คุณจะต้องเป็น root เมื่อคุณเรียกใช้:

python manage.py runserver

ในขณะที่เทคนิคที่ถูกต้องใช้เซิร์ฟเวอร์ในฐานะrootเป็นที่น่ากลัวความคิด - มันจะดีกว่าที่จะchownฐานข้อมูลให้กับผู้ใช้ unprivileged ปกติที่ปกติจะทำงานเซิร์ฟเวอร์ ...
voretaq7

0

สร้างไดเรกทอรีย่อยในไดเรกทอรีทำงาน

mkdir db-folder 

สร้างฐานข้อมูล sqlite ในตำบล

sqlite3 db-folder/db.db

เปลี่ยนเจ้าของสำหรับไดเรกทอรีย่อยเป็น www-data ใน debain หรือ apache ใน centOS

chown -R www-data db-folder

และคว้าเบียร์เย็น ๆ เพราะคุณทำเสร็จแล้ว

P / S: เพื่อตรวจสอบว่าขั้นตอนได้สำเร็จหรือไม่

ls -l data-folder

คุณควรเห็นเช่นนั้น

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

หากคุณกำลังจะโพสต์คำตอบโปรดให้คำตอบที่แตกต่างอย่างมีนัยสำคัญกับคำตอบอื่น ๆ ในคำถามเดียวกัน
masegaloeh

-1

เพิ่งเขียนsudo sqlite3 databaseFilename.sqlและมันทำงาน


ที่อาจใช้งานสำหรับเซสชันผู้ใช้แบบโต้ตอบ แต่ไม่ใช่วิธีแก้ปัญหาที่ไม่ใช่สำหรับเว็บแอปพลิเคชัน ...
HBruijn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.