[Python] DB commit en scope

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 24-06 09:47

4VAlien

Intarweb!

Topicstarter
Onderstaande code werkt. Echter ik ben gedwongen om na elke delete statement een commit te maken. Aangezien deze database op een NAS staat wil ik liever 1 commit uit voeren na alle queries. Als ik dat doe dan wordt er echter niks verwijderd. Ik krijg geen documenten tevoorschijn die precies laten zien wat het effect van cursors en transacties is in python. Ook met een cursor krijg ik deze queries niet allemaal in 1x gecommit. Heeft iemand hier ervaring mee?

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
today = date.today()
oldYear=today.year-2
oldMonth=today.month-3
if(oldMonth < 1):
    oldMonth=today.month-3+12
    oldYear=oldYear-1
oldDate=date(oldYear, oldMonth, 1)
oldDateString=oldDate.strftime("%Y-%m-%d")+" 23:59:59"
#query="delete from PRORATEFACTOR where validto < " + oldDateString
query = "SELECT origincitycode,destinationcitycode,count(validto) as freq from proratefactor where validto>=? group by origincitycode,destinationcitycode having count(validto)>=1"
print query, oldDateString
con = sqlite3.connect(gNewSqlite)
aCursor = con.cursor()
aCursor.execute(query,(oldDateString,))
#print con.total_changes, 'row(s) deleted in ProrateFactor table'
pfArray = aCursor.fetchall()
pfSize = len(pfArray);
aCursor.close()
print "Will now delete old prorate factor rows, this can take up to 10 minutes depending on NAS etc.."
i=0;
for row in pfArray:
    i = i + 1
    if i % 4000 == 0:
        print (100 * i)/pfSize, "%"
    con.execute ("Delete from proratefactor where origincitycode=? and destinationcitycode=? and validto<?",(row[0],row[1],oldDateString))
    con.commit()
con.close()

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 21-06 17:10
offtopic:
Volgens mij heb je een bugje op regel 5: hier wordt nogmaals 3 afgetrokken.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Probeer het eens met executemany(). Eerst maken we een generator (met een generator expression) die de parameters oplevert, daarna voeren we de queries in 1 keer uit:
Python:
1
2
3
4
5
6
7
8
9
param_generator = ((row[0], row[1], oldDateString) for row in pfArray)

con.executemany('Delete from proratefactor where 
  origincitycode=? and  
  destinationcitycode=? and 
  validto<?", 
  param_generator
)
con.commit()

[ Voor 37% gewijzigd door user109731 op 31-05-2010 19:05 ]