Forum: PC Hard- und Software Anzahl Einträge in einer DB prüfen


von Peter G. (peterdergrosse)


Lesenswert?

Hi

ich habe eine SQL Datenbank, die von einem Programm immer wieder mal 
Daten erhält.

In Python habe ich einen Code geschrieben, der laufend kontrolliert, ob 
die DB Daten enthält, falls ja diese dann ausliest, verarbeitet und die 
entsprechenden Einträge löscht.

hier der entsprechende Teil:
1
def data_available():
2
  cursor.execute("SELECT COUNT(*) FROM temp_Proc")
3
  count = cursor.fetchone()[0]
4
  print (count)
5
  if count > 0:
6
    return True
7
  return False

die Funktion wird einmal pro Minute aufgerufen und teilt jeweils mit, 
wieviel Einträge die DB enthält. Wenn Einträge hinzukommen, wird es auch 
richtig engezeigt. Sobald aber die DB einmal leer ist, bzw. sobald die 
Funktion einmal 0 ausgegeben hat, bleibt die Ausgabe auf 0; auch wenn 
suksessive neue Einträge in die DB geschrieben werden.

Hat jemand eine Idee warum dies so ist?

von Clemens L. (c_l)


Lesenswert?

Welche Datenbank?
Wie behandelst du Transaktionen?

von Jens G. (jensig)


Lesenswert?

Peter G. schrieb:
> Sobald aber die DB einmal leer ist, bzw. sobald die
> Funktion einmal 0 ausgegeben hat, bleibt die Ausgabe auf 0; auch wenn
> suksessive neue Einträge in die DB geschrieben werden.

Gut, dann dürfte Dein Programm ja noch nie mehr als 0 angezeigt haben, 
denn die DB fing ja sicherlich mal mit 0 an. Wie hast Du es also 
hinbekommen, daß es initial trotzdem ging?

Wie sieht es mit dem Transaktions-Handling (commit/rollback) bei den 
Prozessen aus, die die Daten löschen, bzw. neue reinfüttern?
Es gibt doch sicherlich ein Tool bei Deiner DB, mit dem Du in die 
Tabellen reinschauen kannst, ob da wirklich Daten drin sind oder nicht. 
Schon mal damit geprüft?
Und arbeiten alle beteiligten Prozesse mit der Tabelle im selben Schema 
herum?. Gebe mal beim Tabellennamen das Schema überall mit an.

: Bearbeitet durch User
von C-hater (c-hater)


Lesenswert?

Peter G. schrieb:

> In Python habe ich einen Code geschrieben, der laufend kontrolliert, ob
> die DB Daten enthält, falls ja diese dann ausliest, verarbeitet und die
> entsprechenden Einträge löscht.
>
> hier der entsprechende Teil:
[...]

Nein, das fragt EINE Tabelle zur Zahl ihrer Einträge ab. Es fragt 
nicht die Datenbank ab, ob sie Daten enthält.

> die Funktion wird einmal pro Minute aufgerufen und teilt jeweils mit,
> wieviel Einträge die DB enthält.

Nein, das tut sie sicher nicht.

> Wenn Einträge hinzukommen, wird es auch
> richtig engezeigt. Sobald aber die DB einmal leer ist

Was ist hier wirklich "leer"? Die DB sicher nicht. Und wie wurde diese 
"Leere" erreicht? Und wohin schreibst du eigentlich genau?

von Sebastian W. (wangnick)


Lesenswert?

Peter G. schrieb:
> Hat jemand eine Idee warum dies so ist?

Nicht mit Bestimmtheit, aber ich hatte mal einen ähnlichen Effekt, und 
die Ursache waren für den Cursor nicht sichtbare Transaktionen. Ich habe 
damals, glaube ich, den Cursor geschlossen und einen neuen erzeugt; der 
konnte dann wieder den aktuellen Stand sehen. Eventuell reicht es ja 
aber auch schon, cursor.commit() aufzurufen; nicht um ausstehende 
Transaktionen des Cursors zu realisieren, sondern um den Cursor wieder 
mit dem Ende der Transaktionskette zu synchronisieren. HTH.

LG, Sebastian

von C-hater (c-hater)


Lesenswert?

Sebastian W. schrieb:

> Eventuell reicht es ja
> aber auch schon, cursor.commit() aufzurufen; nicht um ausstehende
> Transaktionen des Cursors zu realisieren, sondern um den Cursor wieder
> mit dem Ende der Transaktionskette zu synchronisieren. HTH.

Ja, das könnte möglicherweise helfen. Ist jedenfalls definitiv einen 
Versuch wert. Oder noch einen Zacken härter: Cursorobjekt zerstören und 
neu instanziieren. Keine Ahnung, wie man sowas in Python macht, kenne 
nur richtige Sprachen. Wie auch immer: Sollte die Doku sagen. Wie in 
jeder Sprache.

von Sheeva P. (sheevaplug)


Lesenswert?

Peter G. schrieb:
>
1
> def data_available():
2
>   cursor.execute("SELECT COUNT(*) FROM temp_Proc")
3
>   count = cursor.fetchone()[0]
4
>   print (count)
5
>   if count > 0:
6
>     return True
7
>   return False
8
>

Wo kommt diese ominöse Cursor-Instanz her? Was wird sonst noch mit der 
gemacht? Und warum erzeugst Du nicht einfach lokal eine neue, die dann 
automatisch zerstört wird, wenn die Funktion verlassen wird? Vielleicht 
möchtest Du mal folgenden Code ausprobieren. Wenn das auch nicht klappt, 
wären weitere Informationen hilfreich.
1
def data_available(connection):
2
    cursor = connection.cursor()
3
    cursor.execute("SELECT COUNT(*) FROM temp_Proc")
4
    count = cursor.fetchone()[0]
5
    print(count)
6
    if count > 0:
7
        return True
8
    return False

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.