Topic: Problema randomico update record mysql  (Letto 57 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline rdie77

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
Problema randomico update record mysql
« il: Aprile 17, 2020, 13:50 »
Salve a tutti
ho un problema randomico con la mia funzione di update su un DB MySQL (il tutto gira su un raspberry pi3)
Accade talvolta che la funzione di Update non so per quale motivo, se per momentanea indisponibilità del DB (che è sullo stesso raspberry) non mi fa l'aggiornamento del record.
Se poi provo successivamente con una funzione che mi riporta il campo richiesto da 1 a 0, il tutto funge

La mia idea era di ritentare la scrittura nella sezione except di ritentare la scrittura, ma sembra cmq non funzionare.

Grazie a tutti per l'aiuto

def updateDB(tap,dir):
  db = MySQLdb.connect(ipDB,usr,pwd,dbIstance)

  # prepare a cursor object using cursor() method
  cursor = db.cursor()

  sql="UPDATE %s SET Run='0', DataEnd=CURRENT_TIMESTAMP WHERE TipoEvento='%s' and Tapparella='%s' and Run='1'" % \
      (tabEventi,dir, tap)
  #print sql

  try:
     # Execute the SQL command
     cursor.execute(sql)
     # Commit your changes in the database
     db.commit()
  except:
     # Rollback in case there is any error
     #db.rollback()
     cursor = db.cursor()
     cursor.execute(sql)
     db.commit()
  # disconnect from server
  db.close()

Offline nuzzopippo

  • python erectus
  • ***
  • Post: 231
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema randomico update record mysql
« Risposta #1 il: Aprile 17, 2020, 18:30 »
Ciao @rdie77

Purtroppo, non ho familiarità com MySQL, per le mie cose uso PostgreSQL, comunque questa
La mia idea era di ritentare la scrittura nella sezione except di ritentare la scrittura, ma sembra cmq non funzionare.
mi sembra una pessima idea, un errore in una transazione genera un pericolo di inconsistenza non è mai bene cercare di forzare, è opportuno capire perché si genera l'errore.

Un inizio, per capire il perché sarebbe intercettarlo ... dato che non ne comprendi il motivo da cui scaturisce, tant'è che intercetti con un except generico, potresti provare a vedere cosa Ti dice a livello di sistema, ti importi sys, e provi con:
...
  except:
e = sys.exc_info()
for c in e:
print(c)
     # Rollback in case there is any error
     #db.rollback()

Avrai per lo meno indicazione dell'errore accaduto e potrai provare ad intercettarlo specificatamente e vedere di capire perché avvenga

[Edit] Dimenticavo :
Ovviamente, il rollback sarebbe bene riattiarlo ;)
altra dimenticanza : metterei anche la connessione e la creazione del cursore nel blocco try:except, magari può dipendere da quelle operazioni.
« Ultima modifica: Aprile 17, 2020, 18:44 da nuzzopippo »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.028
  • Punti reputazione: 9
    • Mostra profilo
Re:Problema randomico update record mysql
« Risposta #2 il: Aprile 17, 2020, 22:10 »
>> La mia idea era di ritentare la scrittura...

> mi sembra una pessima idea

Ma no guarda, è una pessima idea semplicemente perché, al di là delle ragioni tecniche, non ha proprio senso. Cioè, ti fallisce una cosa e tu che cosa fai? Istantaneamente dopo la riprovi, tale e quale... così, perché magari in quella frazione di secondo siamo entrati in un universo parallelo in cui i computer non sono più macchine di turing... chissà, vale la pena tentare, no?

Dopo di che, quel codice è talmente pieno di cattive idee... non si scrivono le query in quel modo, non si fa una funzione che ogni volta si connette e si disconnette a un dbrms solo per fare una query, non si fa un bare except, non si chiama una variabile "dir", si rispetta la pep8...

Per quanto riguarda l'errore "randomico" (vuol dire "occasionale", per i lettori italiani di questo forum) ovviamente può essere dovuto letteralmente a qualsiasi cosa, visto che non sappiamo niente di quello che circonda quella funzione... a dire il vero un sospetto mi viene... quella query ha una clausola where bella impegnativa, e non è detto che possa venire sempre rispettata. Ho la vaghissima sensazione che ogni tanto "non fa l'aggiornamento del record" perché semplicemente non esiste un record che soddisfa la clausola where; ovvero, è un errore di logica, non di tecnica. Ma è solo una sensazione, eh...

> ti importi sys, e provi con (...)
Nunzio, basta metterci un bel "raise"...

> metterei anche la connessione e la creazione del cursore nel blocco try:except, magari può dipendere da quelle operazioni.
Uhm, in linea di principio sì, connettersi è un'operazione fallibile e quindi bisognerebbe... ma in pratica è davvero improbabile che questo sia il problema... se la connessione fallisce, la creazione di un cursore subito dopo non va a buon fine e tutto crasha felicemente prima di avere il tempo di eseguire la query... quindi l'OP dovrebbe essersene accorto se il problema è di mancata connessione...
« Ultima modifica: Aprile 17, 2020, 22:19 da RicPol »