Archief - Python - SQLite probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

cletus

Legacy Member
gegeven:
-een databank met een tabel met ongeveer een miljoen rijen, id is de sleutel
-een algoritme om op basis van 5 variabelen een 6e variabele te berekenen

gevraagd:
-een manier om efficient alle rijen te updaten

Een werkend programma is dit:
Code:
import sqlite3
import berekenb

teller=0
conn = sqlite3.connect('bank2.db3')
c = conn.cursor()

for row in c.execute('select a1,a2,a3,a4,a5,id FROM awaarden'):
	b1 = berekenb.berekenb(row[0],row[1],row[2],row[3],row[4]) 

	for row2 in c.execute('update awaarden set b1= '+str(b1) where id=row[5]):
		teller+=1
conn.commit()
conn.close()
Het probleem is dat het update algoritme alle rijen overloopt om er 1 te updaten, er wordt dus een miljoen keer een miljoen rijen overlopen. Ik heb een beetje rondgezocht, maar ik heb geen manier gevonden om de row die ingelezen wordt rechtstreeks te updaten. Is dit mogelijk?

Indien niet had ik gedacht aan een workaround, tabel awaardenbis creeren met dezelfde kolommen, voor elke rij uit awaarden alle waarden opslaan, b1 berekenen, alle waarden toevoegen aan de nieuwe tabel, als dat gebeurd is voor alle rijen de tabel awaarden droppen en tabel awaardenbis hernoemen naar awaarden, maar dat is uitaraard allesbehalve een elegante oplossing.

Racemaniac

Legacy Member
zoals alle databases: een index zetten op die id kolom? dan kan hij die veel efficienter updaten ipv de hele tabel te moeten scannen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan