Sqlite und threads

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo, ich habe mal wieder eine Frage, da ich mit meinen aktuellen Fehlern überfordert bin.
Undzwar will ich aus meinem Gui-Hauptprogramm, also der Klasse, einen neuen thread starten, in welchem ich auf ein modul zugreifen will, welches auf meine Datenbank zugreift. Leider habe ich die Verbindung zu sqllite bereits im Hauptprogramm gestartet, da dieses auch durch diverse module auf die datenbank zugreift.
Nun bekomme ich folgenden Fehler, wenn der Thread startet:

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id -1216608576 and this is thread id -1234351248

Das Problem ist für mich leider schwierig zu beschreiben und ich kann kein Code posten, da das Programm einfach zu groß und unübersichtlich ist.

Ich hoffe man kann mir trotzdem helfen und ein paar tips geben, woran das liegen kann.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo,

du könntest die SqliteDB in einen eigenen Thread auslagern. Dort werden dann alle Queries ausgeführt. Die entsprechenden Daten werden mit Queues und put() bzw. get() an den DB-Thread übergeben. Ich habe auf die Schnelle dieses und dies Beispiel gefunden.

Ich will jetzt nicht behaupten, dass die Lösungen jeweils "Musterlösungen" sind - sie veranschaulichen aber das Prinzip, das ich meine.

Anscheinend kann man übrigens mit SqlAlchemy "ThreadPools" oder sowas einrichten - da kenne ich mich aber gar nicht aus.

brb
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hey, danke für die Antwort.
ich kam gerade darauf, dass ich das thread mit der Datenbank vllt auch umgehen kann. Gibt es eine möglichkeit von dem Threat aus eine Funktion aus meiner Klasse auszuführen? Also irgendwie signale zu senden, während dem durchlauf des Threats oder beim beenden.
Das Thread soll eigentlich nur kontrollieren, ob sich der Inhalt einer Datei ändert und wenn dies der Fall ist eine Funktion meiner Hauptklasse ausführen. Über eine while schleife kann ich das ja nicht machen, weil mir dadurch die GUI einfrieren würde.

Lg
Antworten