Datensätze nacheinander auflisten aus Sqlite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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)
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Du führst fetchmany nur einmal aus. Du brauchst eine Schleife, die solange läuft, wie fetchmany Ergebnisse zurückliefert.
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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)
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Und nezzcarth hat Dir gezeigt, was Du statt dessen benutzen sollst. Wo hast Du also noch ein Problem?
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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')
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst also die Listbox dynamisch mit allen Einträgen füllen, aber halt nur nach Bedarf?
Benutzeravatar
__blackjack__
User
Beiträge: 13067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten