ubuntuusers.de

Python + SQLite: Datensatz 1 bis x ausgeben

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Developer92 Team-Icon

Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Hallo, ich habe (wieder mal) ein kleines Programmierproblem. Aktuell hab ich etwa 400 Datensätze in einer SQLite-Datenbank gespeichert.

Jetzt ist es so, dass jede Datenbank mit einem Algorithmus abgearbeitet werden muss, was leider pro Datensatz immer ein paar Minuten dauert.

Ich habe mir also gedacht, dass man immer hundert Datensätze in einen Thread packt (Sprich dass ich mit 4 Threads die 400 Datensätze abarbeiten lasse). Nun die Frage: Kann ich die Gesamtzahl der Datensätze abfragen und dann pro Thread sagen, er soll die Datensätze 101 bis 200 abarbeiten? Ich weiß man könnte die 400 Datensätze locker in eine Liste laden, diese dann aufteilen und jedem Thread ein Stückchen davon übergeben, aber das Problem ist, dass die Zieldatenbank später mehrere Millionen Einträge hat, was die ganze Sache zwecks Arbeitsspeichermangels etwas verkompliziert.

Hoffe jemand versteht das Problem und weiß was ich bräuchte.

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Kann SQLite limit? Wenn ja, sollte das das einfachste sein, da Du damit DB seitig die Datensatzsequenz definieren kannst.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

Kann SQLite limit?

Ah, danke. Das war der Befehl, den ich gesucht habe 👍

Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen.

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen.

Ich würde fetchone() nehmen und nur über den PK zählen. Ansonsten geht das, ja ☺

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Falls es noch jemanden interessiert: Die Anzahl der Datensätze kann man mittels "SELECT COUNT(*) FROM tabelle" mit einem anschließendem "cursor.fetchall()" herausbekommen.

Ich würde fetchone() nehmen und nur über den PK zählen. Ansonsten geht das, ja ☺

Was meinst du mit PK?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Was meinst du mit PK?

Primary Key - also den Primärschlüssel.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Je nach Aufgabe kann man auch - sofern man einen fortlaufenden Index hat, sukzessive Teile abarbeiten, in dem man mit dem Modulo arbeitet:

1
... WHERE pk%20 = 0 AND ...

dann

1
... WHERE pk%20 = 1 AND ...

dann 2, 3, ... 19. Man würde so jeweils 1/20tel der Datensätze abarbeiten.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat.

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat.

Funzen den Tabellen ohne PK? *wunder* Sollte eigentlich ja gar nicht gehen...

Und user unknwowns Vorschlag hat mit meinem nix zu tun!

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Achso, ihr meint also über die ID (so wird das ganze bei mir genannt) zählen lassen. Nun, das wäre eine Möglichkeit. Blöd nur, wenn man keine ID bzw. nen "PK" hat.

Funzen den Tabellen ohne PK? *wunder* Sollte eigentlich ja gar nicht gehen...

Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺

Funktioniert wunderbar 😀

Und user unknwowns Vorschlag hat mit meinem nix zu tun!

Ah, OK

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺

Weil das das relationale Konzept ad absurdum führt! Selbst wenn es technisch geht, solltest Du Dein DB-Design überdenken!

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Warum sollte das nicht gehen? Ich hab in der Tabelle einfach keinen Primary Key definiert und gut wars ☺

Weil das das relationale Konzept ad absurdum führt! Selbst wenn es technisch geht, solltest Du Dein DB-Design überdenken!

Ah, man merkt halt doch, dass ich mich noch nicht so lange mit DB's beschäftige.

Hab eben den Code überarbeitet, jetzt gibts nen Primary Key ☺

Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮

mfg

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

TDeveloper schrieb:

Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮

Kapiere ich nicht! Gib mal nen Beispiel.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Lysander schrieb:

TDeveloper schrieb:

Leider gleich dazu ein Problem/Frage: Warum kann ich mit dem "SQLite Datenbank Browser" den Primary Key trotzdem so ändern, dass er mehrmals in der Tabelle vorkommen kann? Wenn ich das per Python versuche gehts nicht 😮

Kapiere ich nicht! Gib mal nen Beispiel.

Ist doch ganz einfach. Folgendes Beispiel:

1
2
3
4
5
6
7
8
9
import sqlite3
connection = sqlite3.connect('datenbank.db')
cursor = connection.cursor()
cursor.execute('CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT, wert INTEGER)')
for x in range(0,100):
    cursor.execute('INSERT INTO test VALUES(?, ?)', (None, x,))
connection.commit()
# Bisher ging alles. Jetzt kommts:
cursor.execute('INSERT INTO test VALUES(?, ?)', (10, 10,)) # Dann erscheint folgender Hinweis: "sqlite3.IntegrityError: PRIMARY KEY must be unique"

Wenn ich jetzt aber den SQLite Datenbank Browser öffne (hab ich ausm Software-Center installiert, ist recht praktisch zum angucken von Datenbanken 😉 ) kann ich ohne Probleme einen "Record" erzeugen, der die gleiche ID wie ein bereits vorhandener Datensatz hat. Ich hab zum Beweis mal ein Foto angehängt.

mfg

Bilder

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Wie es aussieht ist das ein Fehler im SQLite Manager! Bist Du Dir sicher, dass dort die DB auch entsprechend aktuell ist? Evtl. ist dort die Tabelle anders definiert?

An Deiner Stelle solltest Du Dir mal etwas über Keys durchlesen - letztlich ist das die Grundlage für relationale Datenbanken.

Antworten |