2011-01-09 43 views
37

Câu hỏi: Tại sao tôi không thể mở cơ sở dữ liệu?Sqlite3, OperationalError: không thể mở tệp cơ sở dữ liệu


Thông tin: Tôi đang làm việc trên một dự án có mục đích không quan trọng nhưng sử dụng cơ sở dữ liệu sqlite3. Tôi đã thực hiện một chương trình thử nghiệm chạy và vượt qua để nó trở thành địa điểm để làm cho một cơ sở dữ liệu:

/tmp/cer/could.db

và chương trình kiểm tra đơn vị có thể làm cho db không có vấn đề. Sau đó, tôi thực sự sử dụng chương trình, đi qua cùng một vị trí với chương trình, và nó cho biết

OperationalError: unable to open database file

Tôi đã thử thực hiện với cơ sở dữ liệu trống. với cơ sở dữ liệu, kiểm tra đơn vị bị bỏ lại phía sau và không có cơ sở dữ liệu nào cả. trong cả ba trường hợp, tôi nhận được lỗi này. Phần khó chịu nhất là thực tế là bài kiểm tra đơn vị có thể làm điều đó tốt, nhưng chương trình thực tế thì không.

Bất kỳ manh mối nào về những gì đang diễn ra trên trái đất?

+0

Đó có phải là đường dẫn đầy đủ không? Bạn có chắc chắn rằng bạn không đi qua đường dẫn thông qua các biến môi trường hoặc '~' hoặc một số dạng ngắn khác? – chrisaycock

+0

Thư mục/tmp/cer/có tồn tại không? – thkala

+0

@chrisaycook: vâng. Tôi không. @thkala: nó có. – Narcolapser

Trả lời

47

Chẩn đoán chính: SQLite không thể mở tệp đó vì một số lý do.

Kiểm tra những lý do rõ ràng tại sao, và để xấp xỉ mà tôi khuyên bạn nên kiểm tra:

  • là chương trình chạy trên cùng một máy như bạn đang thử nghiệm nó?
  • Ứng dụng có hoạt động với tư cách bạn (hoặc ít nhất cùng một người dùng khi bạn đang thử nghiệm)?
  • Đĩa có chứa /tmp đầy đủ không? (Bạn đang sử dụng Unix, vì vậy hãy sử dụng df /tmp để tìm hiểu.)
  • Thư mục /tmp/cer có quyền “lẻ” không? (SQLite cần để có thể tạo các tệp bổ sung trong nó để xử lý những thứ như nhật ký cam kết.)
  • Mã kiểm tra đơn vị vẫn đang sử dụng cơ sở dữ liệu đó phải không? (Đồng thời mở có thể với một SQLite hiện đại và khi ở đúng hệ thống tập tin - mặc dù /tmp hầu như luôn đúng loại FS nên có thể không phải vậy - nhưng nó vẫn không được khuyến nghị.)
  • Mã số thực sự là cố gắng ghi vào cơ sở dữ liệu đó, hoặc là thứ gì đó “thông minh” đánh bắt bạn ra ngoài và khiến nó cố mở một cái gì đó khác? (Tôi đã bị phát hiện bởi điều này trong mã của tôi trong quá khứ; đừng nghĩ rằng nó không thể xảy ra với bạn ...)
  • Bạn đang sử dụng cùng một phiên bản của thư viện SQLite trong các bài kiểm tra đơn vị và mã sản xuất ?

Nếu bạn không ở cùng một máy, có thể hệ thống sản xuất không có thư mục /tmp/cer. Rõ ràng để khắc phục điều đó trước tiên. Tương tự, nếu bạn đang sử dụng cùng một máy nhưng đang chạy với tư cách người dùng khác nhau, bạn có thể gặp phải sự cố về quyền/quyền sở hữu. Không gian đĩa là một bản ghi nhớ quan trọng khác, nhưng ít có khả năng hơn. Tôi không nghĩ rằng đó là lần cuối cùng ba, nhưng họ đang có giá trị kiểm tra nếu các vấn đề triển khai rõ ràng hơn được sắp xếp. Nếu không có vấn đề gì ở trên, bạn đã gặp phải một vấn đề kỳ lạ và sẽ phải báo cáo nhiều thông tin hơn nữa (nó có thể là một lỗi trong SQLite, nhưng biết được các nhà phát triển của nó, tôi tin rằng điều này là không chắc chắn).

+0

có. Vâng. Không. Không phải là tôi biết. Nó không nên. Không. cơ sở dữ liệu được tạo ra bởi cùng một hệ thống, khác biệt duy nhất là UTFile.py gọi nó thay vì cSystem.py. có, tôi đang sử dụng SQLite được xây dựng trong phiên bản đi kèm với python. – Narcolapser

+4

đã tìm thấy sự cố của tôi. các dây không hoàn toàn giống nhau. Có một sự khác biệt nhỏ vì tập tin cấu hình của tôi. tập tin cấu hình đã để lại một ngắt dòng trong đường dẫn của tôi vì vậy tôi đã cố gắng để mở: '/ tmp/cer/\ncloud.db' có vấn đề của tôi. nhưng đây là một câu trả lời rất hay. cám ơn sự tử tế của anh! – Narcolapser

+3

Cảm ơn bạn! Tôi đã có vấn đề này, và nó đã thực sự thiếu quyền ghi vào thư mục của người sử dụng máy chủ web, mặc dù các tập tin có quyền ghi cho người dùng đó. – arantius

1

Đảm bảo bạn không chỉnh sửa tệp settings.py khi cố gắng chạy syncdb, bạn sẽ gặp lỗi tương tự !!!

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 
21

này đã làm việc cho tôi:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db") 

Lưu ý: đúp chéo trong đường dẫn đầy đủ

Sử dụng python v2.7 trên Win 7 doanh nghiệp và Win Xp Pro

Hy vọng điều này sẽ giúp một ai đó.

+0

Đã dành một giờ để tìm kiếm điều này !! – mkingsbu

1

tôi phải đối mặt với cùng một vấn đề trên Windows 7. Tên cơ sở dữ liệu của tôi là test và tôi đã nhận lỗi:

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 

tôi thay test với test.db và và tất cả đã đi trơn tru.

1

Một lý do có thể đang chạy mã trong đường dẫn không khớp với đường dẫn được chỉ định của bạn cho cơ sở dữ liệu. Ví dụ, nếu trong mã của bạn, bạn có:

conn = lite.connect('folder_A/my_database.db') 

Và bạn chạy các mã bên trong folder_A hoặc những nơi khác mà không có một folder_A nó sẽ nâng cao báo lỗi như vậy. Lý do là SQLite sẽ tạo ra tệp cơ sở dữ liệu nếu nó không tồn tại không phải là thư mục.

Một cách khác để khắc phục sự cố này có thể bao gồm lệnh kết nối của bạn trong biểu thức try-except và tạo thư mục nếu nó tăng sqlite3.OperationalError.

từ import os mkdir nhập khẩu sqlite3 như Lite

try: 
    conn = lite.connect('folder_A/my_database.db') 
except lite.OperationalError: 
    mkdir('folder_A') 
finally: 
    conn = lite.connect('folder_A/my_database.db') 
+0

Cảm ơn! Đây là những gì tôi đang tìm kiếm.Hơn nữa, không phải là 'else' dư thừa ở đây vì đối tượng' conn' luôn được tạo bất cứ khi nào mệnh đề được kích hoạt? Ngoài ra, nó sẽ được nhiều thành ngữ để di chuyển các tuyên bố trong mệnh đề 'else' để phần' except' và thêm một 'cuối cùng' với' conn.close() '? –

+0

Có cảm ơn bạn đã lưu ý. Phần 'khác' thực ra phải là 'cuối cùng'. Ngoài ra không cần phải đóng kết nối ngay sau khi tạo một kết nối. – Kasramvd

1

Trên unix tôi đã nhận lỗi rằng khi sử dụng các phím tắt ~ cho thư mục người dùng. Thay đổi nó thành /home/user đã giải quyết được lỗi.

Các vấn đề liên quan