Einfachste Weg, um SQLite-Abfrage zu wiederholen, wenn DB gesperrt ist?

Ich bin nicht ganz sicher, wo ich fragen soll, ich hoffe, dass es hier richtig ist.

Was ich suche ist die einfachste Lösung, um eine SQLite-Abfrage erneut zu versuchen, wenn der DB beschäftigt ist. Ich benutze Quassel als meinen IRC-Client auf einem Server und ich möchte alte Protokolle in eine separate DB verschieben, um die zu halten, die man klein verwendet. Das Drehbuch, das ich geschrieben habe, ist:

CREATE TEMP TABLE delfrom (id integer,val integer); ATTACH '/home/irc/oldlog.db' as log; BEGIN IMMEDIATE; REPLACE INTO delfrom (id,val) select 1337,messageid from backlog where time < strftime('%s', 'now','-14 days') ORDER BY messageid DESC LIMIT 1; INSERT INTO log.log (messageid,time,bufferid,type,flags,senderid,message) SELECT messageid,time,bufferid,type,flags,senderid,message FROM backlog WHERE messageid < (SELECT val FROM delfrom where id=1337); DELETE FROM backlog WHERE messageid < (SELECT val FROM delfrom where id=1337); PRAGMA incremental_vacuum; COMMIT; 

Und ich laufe es mit sqlite3 quassel-storage.sqlite <movelog.sql

Das Problem ist, da Quassel ausgeführt wird, während dies ausgeführt wird, manchmal das BEGIN IMMEDIATE; Schlägt fehl, weil die DB gesperrt ist.

Kann mir jemand einen einfachen Weg geben, um dieses Setup zu ändern, so dass die Abfrage nur noch einige Sekunden wiederholt wird, bis es funktioniert? Ich habe gelesen, dass der Python-SQLite-Wrapper das eingebaut hat? Gibt es eine besondere Art, wie ich das aktivieren muss, und wichtiger ist, kann ich die zweite DB mit Python anhängen? Es gibt einen Timeout-Parameter zu sqlite3.connect aber ich bin nicht ganz sicher, wie das funktioniert. Verlangt Python die ganze DB zum Schreiben auf jede Verbindung?

Ich bin in keiner Weise fixiert, um Python zu verwenden. Die Lösung würde ich lieber sein, dass sqlite3 0 zurückgibt, wenn dieser Fehler auftritt und dann einfach in eine Schleife in der Shell einpacken, aber das scheint nicht zu funktionieren.

3 Solutions collect form web for “Einfachste Weg, um SQLite-Abfrage zu wiederholen, wenn DB gesperrt ist?”

Python wird regelmäßig wiederholen, wenn die Tabelle gesperrt ist. Es wird nicht wiederholt, wenn die Datenbank gesperrt ist. Tabellensperren werden nur im selben Prozess verbreitet, durch Gewinde, gemeinsame Verbindungen oder andere Methoden.

Datenbanksperren ergeben sich, wenn mehrere Prozesse in die Datei schreiben und (einfach) existieren, solange das Journal existiert.

Um dies zu vermeiden, kann der WAL-Modus für die Lagerung verwendet werden. (Pragma journal_mode = wal;)

Um auf Datenbank-Sperren zu drehen, musst du die Execute-Funktion mit so etwas umschließen:

 for x in range(0, timeout): try: with connection: connection.execute(sql) except: time.sleep(1) pass finally: break else: with connection: connection.execute(sql) 

Der letzte Verbindungsblock wird die Ausnahmen ordnungsgemäß zurückgeben. Dies sollte verbessert werden, indem man die Ausnahme für die Datenbank gesperrt und ansonsten die ursprüngliche Ausnahme anhebt, aber das ist eine Übung für den Leser.

Die SQLite-Bibliothek selbst wird regelmäßig wiederholt, wenn Sie das Timeout hoch genug eingestellt haben.

Im Standard-Python-Wrapper ist dies der zweite Parameter von sqlite3.connect .

Verwenden Sie den WAL-Modus für Sqlite, wenn Sie Version größer als 3.7 https://www.sqlite.org/wal.html sind

 connect = sqlite3.connect(DB, **kwargs) connect.execute("PRAGMA journal_mode=WAL") 

Nach der Dokumentation "WAL bietet mehr Parallelität als Leser nicht blockieren Schriftsteller und ein Schriftsteller nicht blockieren Leser.Lesen und Schreiben kann gleichzeitig fortfahren."

  • Grafische sqlite3-Daten mit reportlab
  • Es ist möglich, Export Tabelle sqlite3 Tabelle zu csv oder ähnlich?
  • Brauchen Sie Hilfe bei der Identifizierung eines Speicherverlusts mit Matplotlib und Kolben
  • Sqlite - Verwenden Sie Backticks (`) oder doppelte Anführungszeichen (") mit Python
  • Wie stelle ich Informationen in eine Sqlite-Datenbank mit Genie Programming Language ein?
  • Vergleich von zwei sqlite3 Tabellen mit Python
  • So teilen Sie einzelne SQLite-Verbindung in Multi-Threaded Python-Anwendung
  • Django ManyToMany Beziehungsfehler
  • Sqlite3 Einsatz mit Python und Python cgi
  • Python CSV zu SQLite
  • Python-sqlite3 - Auto-Inkrement von Nicht-Null-Primärschlüssel?
  • Python ist die beste Programmiersprache der Welt.