Anzahl Einträge in einer DB prüfen

OP #7386552
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?

#7386583
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.

#7387023
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?

#7387029
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

#7387045
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.

#7387053
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren