Seite 1 von 1
Datensätze nacheinander auflisten aus Sqlite
Verfasst: Samstag 12. Dezember 2020, 12:43
von ossi047
Hallo Spezialisten,
ich hätte da eine Frage. Ich habe in der Datenbank z.B.: 50 Datensätze und möchte
am Bildschirm jeweils die ersten 10 Datensätze anzeigen, nach Eingabe einer
z.B.: Taste die vorigen 10 überschreiben mit den nächsten 10 Datensätze usw.
Ich bring zwar die ersten z.B.: 3 Datensätze heraus, komme aber nicht drauf
wie ich die weiteren Datensätze auflisten kann. Nachstehend mein Code bis jetzt.
Danke für euere Hilfe.
import sqlite3
def suche():
verbindung = sqlite3.connect('C:/users/test.db')
zeiger = verbindung.cursor()
zeiger.execute("SELECT * FROM material;")
ausgabe = zeiger.fetchmany(3)
for elem in ausgabe:
print(elem)
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Samstag 12. Dezember 2020, 13:08
von nezzcarth
Du führst fetchmany nur einmal aus. Du brauchst eine Schleife, die solange läuft, wie fetchmany Ergebnisse zurückliefert.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Sonntag 13. Dezember 2020, 10:56
von ossi047
Mit dieser Antwort kann ich leider nichts anfangen.
Da die Schleife immer vom 1. Datensatz beginnt.
Ich möchte z.B.: die ersten 10 Datensätze auflisten,
dann die nächsten 10 bis zum Ende. Die Daten
werden dann in einer Listbox angezeigt.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Sonntag 13. Dezember 2020, 11:16
von Sirius3
Du mußt natürlich immer den gleichen zeiger verwenden.
Wenn Du nicht weiter kommst, solltest Du Deinen Code zeigen, der das Problem zeigt und nicht irgendwelche Ausschnitte davon.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Sonntag 13. Dezember 2020, 11:22
von nezzcarth
ossi047 hat geschrieben: Sonntag 13. Dezember 2020, 10:56
Mit dieser Antwort kann ich leider nichts anfangen.
Du brauchst eine zweite Schleife. Der Cursor ist zustandsbehaftet.
Du musst deinen Code nur so umbauen (ungetestet:)
Code: Alles auswählen
def suche():
verbindung = sqlite3.connect('C:/users/test.db')
zeiger = verbindung.cursor()
zeiger.execute("SELECT * FROM material;")
while True:
ausgabe = zeiger.fetchmany(3)
if not ausgabe:
break
for elem in ausgabe:
print(elem)
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Sonntag 13. Dezember 2020, 14:55
von ossi047
Das ist der Code und nicht irgendwas:
import sqlite3
def suche():
verbindung = sqlite3.connect('C:/users/test.db')
zeiger = verbindung.cursor()
zeiger.execute("SELECT * FROM material;")
ausgabe = zeiger.fetchmany(3)
for elem in ausgabe:
print(elem)
Dieser Code zeigt immer die gleichen drei ersten Datensätze. Welcher Code sollte da noch fehlen?
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Sonntag 13. Dezember 2020, 14:59
von Sirius3
Und nezzcarth hat Dir gezeigt, was Du statt dessen benutzen sollst. Wo hast Du also noch ein Problem?
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Montag 14. Dezember 2020, 17:39
von ossi047
Leider funktioniert das Beispiel nicht. Es werden alle Datensätze angezeigt.
Und nicht Datensatz 1-3 und dann 4-7 usw. Danke auf jeden fall für die Infos.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Montag 14. Dezember 2020, 17:45
von nezzcarth
ossi047 hat geschrieben: Montag 14. Dezember 2020, 17:39
Leider funktioniert das Beispiel nicht.
Doch, das Beispiel funktioniert. Und natürlich werden alle Datensätze angezeigt, weil das ist, was die innere Schleife, die ich von dir übernommen habe, eben tut; sie iteriert über die (drei) Ergebnisse und zeigt sie untereinander an. Wenn du unterhalb der inneren For-Schleife' auf der gleichen Einrückungsebene einfach ein leeres print platzierst, siehst du, dass die Ausgabe in Dreier-Päckchen erfolgt. Wenn das anders dargestellt werden soll, muss du spezifischer werden.
EDIT:
Beispiel mit einer Dummy-Datenbank:
Code: Alles auswählen
In [1]: import sqlite3
In [2]: def suche():
...: verbindung = sqlite3.connect('test.db')
...: zeiger = verbindung.cursor()
...: zeiger.execute("SELECT * FROM material;")
...: while True:
...: ausgabe = zeiger.fetchmany(3)
...: if not ausgabe:
...: break
...: for elem in ausgabe:
...: print(elem)
...: print()
...:
In [3]: suche()
(1, 'A')
(2, 'C')
(3, 'C')
(4, 'D')
(5, 'E')
(6, 'F')
(7, 'G')
(8, 'H')
(9, 'I')
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Montag 14. Dezember 2020, 18:04
von Sirius3
@ossi047: woher sollen wir wissen, was Du eigentlich möchtest, wenn Du es nicht verrätst. Das Beispiel zeigt, wie man es macht, jetzt mußt Du das nur noch in Dein Programm richtig einbauen.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Dienstag 15. Dezember 2020, 12:12
von ossi047
Ja das Beispiel funktioniert auch bei mir so. Es werden aber alle Datensätze in dreier Gruppen
angezeigt. Bei 500 Datensätze kann ich damit nichts anfangen. Was ich machen möchte ist folgendes:
Ich hole mir die ersten 3 Datensätze aus der Sqlite Datenbank in eine Listbox und bearbeite
sie und schreibe sie wieder in die Datenbank. Das funktioniert auch.
Aber wie komme ich jetzt zu den nächsten 3 Datensätzen aus der Datenbank in die Listbox? usw.
Ev. über einen Event oder Button oder Sql Code?
Oder ich suche mir 25 Datensätze über eine Auswahl aus der Datenbank (das funktioniert auch),
kann aber nur 10 Datensätze in der Listbox anzeigen. Wie bekomme ich eben die nächsten
10 Datensätze nach Bearbeitung der ersten Datensätze in die Listbox?
Da liegt leider das Problem, da komme ich einfach nicht drauf.
Ich hoffe ich habe das Problem ausreichend erklärt.
Bitte um weitere gute Ideen.
Danke vielmals.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Dienstag 15. Dezember 2020, 12:36
von __deets__
Warum holst du dir nicht alle Datensätze ein eine Liste, und bearbeitest die dann in Teilen? Alternativ kannst du auch mit zwei cursor Objekten arbeiten. Eines zum abholen, eines zum updaten.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Dienstag 15. Dezember 2020, 13:10
von nezzcarth
Ich habe Schwierigkeiten, die Problematik zu sehen. Innerhalb der Schleife, kannst du mit deinen 3-er Paketen doch machen was du möchtest, egal ob das jetzt eine simple Ausgabe über print ist, oder eben komplexere GUI-Operationen, Modifizieren von Datensätzen, usw. Die Logik ist doch dieselbe. __deets__ hat ansonsten doch zwei m.M.n. sinnvolle Ansätze vorgeschlagen. Notfalls kannst du Paginierung auch über 'OFFSET' und 'LIMIT' direkt in SQL erreichen. Das ist dann aber wirklich sehr zu Fuß; ich würde das nicht empfehlen.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Dienstag 15. Dezember 2020, 16:04
von ossi047
Danke für euere Vorschläge. Es kann keinen Sinn machen sich 500 Datensätze (voraussichtlich werden es an die 3000 sein)oder mehr von der Datenbank in eine Listbox zu laden, um einen Datensatz (oder eben auch 25) zu ändern. Über Sucheingaben kann ich das schon eingrenzen, aber es können halt eben auch viele Datensätze werden. Es gibt halt keine Möglichkeit eben z.B: die ersten 10 Datensätze zu laden und dann halt die nächsten 10 nachzuladen bis halt alle verarbeiten wurden. Danke nochmals für eure Mühe aber leider keine Lösung.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Dienstag 15. Dezember 2020, 18:49
von __deets__
Wer sagt denn, dass die 500 oder auch 3000 Datensätze sofort in eine Combobox verbracht werden müssen? Du kannst die ja auch nacheinander anbieten. Wobei das allerdings alles sehr knödelig klingt. Selbst wenn es da was von ratiopharm gäbe.
Vielleicht holst du mal etwa aus, was der Zweck des ganzen ist.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Mittwoch 16. Dezember 2020, 17:29
von ossi047
Hallo Ihr lieben Spezialisten.
Ist das wirklich so schwer zu verstehen?
Ich habe eine Listbox mit 10 Zeilen habe aber 1555 Zeilen (Datensätze) welche ich ausgewählt habe über eine Abfrage in der Datenbank.
jetzt kann ich die 1555 Zeilen in meine Listbox einlesen wo nur die ersten 10 angezeigt werden. Jetzt kann ich natürlich von oben nach und
mit der Maus usw. hin-und her scrollen.
Ich möchte aber eine Abfrage (Sql oder Python Code) die mir die ersten gefundenen 10 Datensätze aus der Abfrage (aus z.B.: 154 möglich Datensätze) ausgibt welche
ich in eine Listbox übernehme. Nur die ersten 10 gefundenen Datensätze (wegen der Geschwindigkeit). Danach über ev. einen Tastendruck
die nächsten 10 Datensätze aus der Datenbank heraussucht und diese übernehme ich wieder in die Listbox usw. bis halt keine mehr da sind.
Ich hoffe ich konnte das jetzt etwas verständlicher Erklären.
Danke nochmals für eure Geduld und Interesse.
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Mittwoch 16. Dezember 2020, 17:40
von Sirius3
Du willst also die Listbox dynamisch mit allen Einträgen füllen, aber halt nur nach Bedarf?
Re: Datensätze nacheinander auflisten aus Sqlite
Verfasst: Mittwoch 16. Dezember 2020, 18:58
von __blackjack__
@ossi047: Ich denke das haben wir schon verstanden. Die Lösung ist immer noch *alle* Datensätze abzufragen und dann immer nur 10 davon in der Listbox anzuzeigen. Alles andere wird komplizierter.
Wobei das IMHO eine komische Schnittstelle ist.