Datenbank SQL Lite hilfe?
Hallo,
ich bin dabei Python zu lernen und wollte ein Ticket system erstellen womit man nur die Maus benutzen braucht ich bin auch schon fast fertig alles funktioniert wunderbar allerdings gibt es ein Problem und zwar will ich das 2 Nutzer gleichzeitig Tickets bzw. zeilen inder Tabelle ausfüllen können. das funktioniert nicht so ganz wenn 2 benutzer Angemeldet sind und beide das Programm gestartet haben (Beide Computer sind an gleiches Lokales Netzwerk verbunden) ist es so das der eine Nutzer seine EInträge macht der 2te Nutzer kann entweder keine Einträge machen oder er macht welche aber in seiner Tabelle entstehen zeilen vom anderen nutzer die leer sind. Das Problem scheint SQL Lite zu sein. Ist wohl nicht ganz ausgelegt das 2 nutzer gleichzeitig arbeiten. ich wollte aber das ganze Offline belassen ohne My SQL oder so davon habe ich ehh keine ahnung.
Jetzt habe ich CHAT GPT gefragt und er sagt mir es gibt eine möglichkeit mit Warteschlange um genau zu sein hat er das gesagt :
Datenbank-Verwaltung im Code: Falls du SQLite unbedingt verwenden möchtest, kannst du im Python-Programm sicherstellen, dass nur ein Nutzer gleichzeitig schreibend auf die Datenbank zugreift. Du könntest dazu eine Warteschlange einrichten, die Schreibanforderungen von verschiedenen Nutzern entgegennimmt und nacheinander ausführt.
also das hört sich genau richtig an und daher wollte ich fragen ob sich jemand damit auskennt da Datenbank für mich so 0 Ahnung.
2 Antworten
Passiert es wirklich so häufig, dass zwei Personen am selben Ticket arbeiten?
Wenn die DB es nicht hergibt, fallen mir spontan drei gängige Wege ein:
- Du setzt einen Lock auf den Datensatz, der bearbeitet wird. Hier ist es am kniffligsten, sicherzustellen, dass der Lock am Ende der Arbeit freigegeben wird. Sonst hast du einen gesperrten Datensatz, ohne dass ihn jemand in Bearbeitung hat.
- Du ziehst dir die Daten in den Cache und arbeitest nur auf dem Cache und wenn du fertig bist, speicherst du deinen Stand. Beim Speichern passiert Folgendes: Die Anwendung schaut, ob der aktuelle Stand des Datensatzes (DB) dem des ursprünglich geladenen entspricht. Wenn ja, dann speichern, sonst: Du kannst verschieden reagieren, z. B. Änderungen anzeigen und speichern nur, wenn gewünscht. Du kannst einbauen, dass Änderungen übernommen werden, die sich mit deinen nicht überschneiden. Außerdem kannst du eine Benachrichtigung schicken, wenn jemand bereits einen Datensatz geladen hat oder wenn du speichern möchtest, was ein anderer auch in Bearbeitung hat.
- Bei vielen Programmen gewinnt stumpf der, der seine Daten zuletzt gespeichert hat.
Wie gesagt finde ich das alles aber etwas "über". Eine einfache Absprache, wer was bearbeitet erspart dir sehr viel Entwicklungsaufwand.
Alternativ was ich nicht getestet habe aber sehr sicher funktioniert ist das dass Programm auf 2 verschiedenen Ordnern platziert wird und beide programm erstellen ihre eigene Tabelle somit hat jeder ihre eigene Tabelle man müsste dann später nur beide kombinieren was halt wieder ein Arbeitsschritt mehr ist und ich will halt eigentlich das so wenig wie möglich zusätzlich gemacht werden muss.
Wenn zwei nebeneinander sitzen, sollte es noch einfacher sein, sich mündlich abzustimmen.
Aber gut. Du kannst die Änderungen in eine Warteschlange setzen und die Reihenfogle beliebig festlegen, aber in der einfachsten Lösung gewinnt immer der, der hinten in der Warteschlange steht und alle Änderungen der Bearbeitungen davor gehen verloren.
Deswegen habe ich vorgeschlagen, dass man die Daten vergleichen müsste oder einfach keine Änderungen zulassen, solange jemand den Datensatz offen hat.
Das schöne daran, dass du dir die Ursprungsdaten im Cache hältst wäre, dass du eine Rückgängfunktion anbieten könntest.
Oder, was in manchen Fällen auch Sinn macht ist einfach jede Änderung in einem Feld direkt wegzuschreiben.
Ja die herausforderung ist ja das beide gleichzeitig EInträge machen sollen können. Sagen wir beide erhalten in einem Kundencenter Anfragen und man muss jetzt Tickets erstellen und wenn da laufend aufträge oder so rein kommen und diese in der Tabelle Dokumentiert werden müssen kann man schlecht immer den einen fragen ehm kann ich jetzt kurz auf die Tabelle drauf. das ist nicht das Ziel.
Du hast Recht. Die ganze Tabelle zu locken ergibt keinen Sinn. Ich sehe aber kein Konfliktpotenzial, wenn zwei Personen gleichzeitig ein neues Ticket erstellen. Jedes Ticket bekommt seine eigene Satzkennung. Da braucht nichts in eine Queue.
Ich würde mir die Satzkennung auch erst beim Schreiben holen, weil du sonst beim Abbruch Lücken bekommst.
Ja aber ich habe es getestet ich habe das Programm 2x gestartet und dann Parallel versucht einträge zu machen und dabei entstehen entweder freie zeilen wenn der andere nutzer ebenfalls einträge macht. Die Tabelle selbst wird auch nicht Aktualissiert sodass der andere nutzer sieht das da gerade was eingetragen wurde. Das ist eigentlich so mein letztes hindernis dann wäre ich fertig aber hier komme ich irgendwie nicht mehr weiter
Du könntest mit Foreignkeys arbeiten und jede nachricht eine Id zuweisen die du wiederrum mit der Id des textes in der anderen spalte zuweist
https://www.sqlite.org/lockingv3.html
Das solltest Du definitiv gelesen haben. Die Änderungen zu queuen verbessert die Gesamtsituation ohnehin nicht.
Also es ist so es sind 2 Personen die parallel zusammen nebeneinander sitzen und beide ein computer haben und beide machen gleichzeitig Einträge. Ich dachte an sowas wie die Nutzer machen Einträge diese landen noch nicht direkt in der Tabelle sondern werden in eienr Warteschlange eingereiht und später beispiel nach 5 Sekunden übertragen. das hört sich eigentlich machbar an ? oder ?