ARPA-SIMC / dballe

Fast on-disk database for meteorological observed and forecast data.
Other
19 stars 6 forks source link

"OSError: executing BEGIN:cannot start a transaction within a transaction" without transaction #194

Closed pat1 closed 5 years ago

pat1 commented 5 years ago

non utilizzare le transazioni è deprecato

DeprecationWarning: calling query_data without a transaction is deprecated

ma sembrerebbe invece innescare un errore come dimostra questo programma che testa le query data e le query summary

import dballe

db =dballe.DB.connect("sqlite:dati.sqlite")
rec={}
rec["query"] = "details"

print ("QUERY DATA")
print ("QUERY DATA")

print("prima query")
with db.transaction() as t:
    with t.query_data(rec) as cur:
        for row in cur:
            pass
            #print("Station:", cur["station"])
print("fatta")

print("seconda query")
with db.transaction() as t:
    with t.query_data(rec) as cur:
        for row in cur:
            pass
            #print("Station:", cur["station"])
print("fatta")

print("terza query")
cur = db.query_data(rec)
for row in cur:
    pass
    #print("Station:", cur["station"])
cur.__exit__(None,None,None)
print("fatta")

print("quarta query")
cur = db.query_data(rec)
for row in cur:
    pass
    #print("Station:", cur["station"])
print("fatta")

try:
    print("quinta query")
    cur = db.query_data(rec)
    for row in cur:
        pass
        #print("Station:", cur["station"])
    print("fatta")
except Exception as e:
    print (e)
    cur.__exit__(None,None,None)

print ("SUMMARY")
print ("SUMMARY")

print("prima query")
with db.transaction() as t:
    with t.query_summary(rec) as cur:
        for row in cur:
            pass
            #print("Station:", cur["station"])
print("fatta")

print("seconda query")
with db.transaction() as t:
    with t.query_summary(rec) as cur:
        for row in cur:
            pass
            #print("Station:", cur["station"])
print("fatta")

print("terza query")
cur = db.query_summary(rec)
for row in cur:
    pass
    #print("Station:", cur["station"])
cur.__exit__(None,None,None)
print("fatta")

print("quarta query")
cur = db.query_summary(rec)
for row in cur:
    pass
    #print("Station:", cur["station"])
print("fatta")

try:
    print("quinta query")
    cur = db.query_summary(rec)
    for row in cur:
        pass
        #print("Station:", cur["station"])
    print("fatta")
except Exception as e:
    print (e)
    cur.__exit__(None,None,None)

è possibile anche che sia correlata a #190 ?

edigiacomo commented 5 years ago

È deprecato perché in alcuni casi potrebbe appunto dare errori, ma non sempre. Se ad esempio hai un semplice script che fa solo una query e poi termina, puoi ancora usare db.query_data, ma hai errore nei casi in cui fai più di una operazione sullo stesso db.

In #146 avevo proposto (proposta accolta) di aggiungere il deprecated e poi di togliere i metodi dballe.DB.{query,insert,remove}* a partire da una 8.X. Non era stato fatto immediatamente perché avevamo molte procedure al SIMC che ricadevano nello scenario che ti ho descritto sopra.

Adesso abbiamo sistemato tutte le procedure, quindi apro issue per chiedere di eliminare questi metodi nella prossima release.

edigiacomo commented 5 years ago

Vedi #196