2010-07-03 10 views
24

Ich habe einige sich wiederholende Vorgänge in meiner Anwendung gemacht (es Prüfung), und plötzlich einen seltsamen Fehler Ich erhalte:OperationalError: Datenbank ist gesperrt

OperationalError: database is locked 

ich den Server neu gestartet haben, aber der Fehler bestehen bleibt . Worum kann es gehen?

Antwort

41

Von django doc:

SQLite is meant to be a lightweight database, and thus can't support a high level of concurrency. OperationalError: database is locked errors indicate that your application is experiencing more concurrency than sqlite can handle in default configuration. This error means that one thread or process has an exclusive lock on the database connection and another thread timed out waiting for the lock the be released.

Python's SQLite wrapper has a default timeout value that determines how long the second thread is allowed to wait on the lock before it times out and raises the OperationalError: database is locked error.

If you're getting this error, you can solve it by:

Switching to another database backend. At a certain point SQLite becomes too "lite" for real-world applications, and these sorts of concurrency errors indicate you've reached that point.

Rewriting your code to reduce concurrency and ensure that database transactions are short-lived.

Increase the default timeout value by setting the timeout database option optionoption

http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption

+1

Geben Sie eine längere als Standard-Timeout kann helfen, das Problem zu lindern: 'create_engine ('sqlite: /// {}' .format (xxx), connect_args = { 'timeout': 15}) ' –

+0

In meinem Fall hatte ich die Datei mit' SQLiteDatabaseBrowser.exe' ... – citynorman

13

Der praktische Grund dafür ist oft, dass die Python oder django Schalen haben eine Anfrage an die DB geöffnet und es wurde nicht richtig geschlossen; Wenn Sie Ihren Terminalzugriff beenden, wird es oft freigegeben. Ich hatte diesen Fehler beim Ausführen von Befehlszeilen-Tests heute.

Edit: Ich bekomme regelmäßig Upvotes zu diesem Thema. Wenn Sie möchten, den Zugang zu töten, ohne das Terminal neu zu starten, dann von Kommandozeilen können Sie tun:

from django import db 
db.connections.close_all() 
+1

geöffnet, wie man es repariert, ohne Terminal zu töten? Irgendeine Idee? – neuronet

+0

@neuronet Schließen Sie Ihre Verbindung in der Shell? –

5

In meinem Fall war es, weil ich die Datenbank von SQLite Browser öffnen. Wenn ich es über den Browser schließe, ist das Problem verschwunden.

+0

Danke, dass es für mich funktioniert hat. – an0nh4x0r

-1

versuchen, diesen Befehl ein:

sudo fuser -k 8000/tcp 
+0

-1, Downvoted, da es keine Erklärung dafür gibt, was diese Lösung tut und wie, und dabei auch Annahmen über den Port trifft, der verwendet wird – helplessKirk

+0

Hat es trotzdem geholfen? –