Cuando se utiliza el controlador SQLite en python - la configuración de una característica después de cambiar el valor de un campo de atributo crea un bucle infinito en el primer registro. el mismo código funciona bien si sustituyo el controlador sqlite por un shapefile de esri. un poco de código para configurar el problema -
'''create a new database with a point feature containing 2 records'''
def mkptdb():
drv=ogr.GetDriverByName('SQLite')
if os.path.exists('test.sqlite'):
os.remove('test.sqlite')
ds=drv.CreateDataSource('test.sqlite',options=['SPATIALITE=yes'])
lyr=ds.CreateLayer('test',None,ogr.wkbPoint25D)
flddef=ogr.FieldDefn('Name',ogr.OFTString)
flddef.SetWidth(32)
lyr.CreateField(flddef)
flddef=ogr.FieldDefn('newfld',ogr.OFTString)
flddef.SetWidth(32)
lyr.CreateField(flddef)
feat=ogr.Feature(lyr.GetLayerDefn())
feat.SetField('Name','george')
pt=ogr.Geometry(ogr.wkbPoint)
pt.AddPoint(150000,48375999)
feat.SetGeometry(pt)
lyr.CreateFeature(feat)
feat=ogr.Feature(lyr.GetLayerDefn())
feat.SetField('Name','fred')
pt=ogr.Geometry(ogr.wkbPoint)
pt.AddPoint(150050,48376005)
feat.SetGeometry(pt)
lyr.CreateFeature(feat)
feat.Destroy()
ds=None
'''function to update one of the existing fields - this is the part that loops forever'''
def updatePt():
print 'updating...'
drv=ogr.GetDriverByName('SQLite')
ds=drv.Open('test.sqlite',True)
lyr=ds.GetLayerByName('test')
for feat in lyr:
s=feat.GetField('name')
print s
feat.SetField('newfld','hi')
lyr.SetFeature(feat) #continuous loop stops if this is commented out
feat.Destroy()
como se indicó anteriormente - si comento la línea 'lyr.SetFeature(feat)' - el bucle infinito termina y la característica se incrementará como se esperaba. pero sin esa línea, el valor del campo no se actualiza.
¿pensamientos? python 2.7.6, gdal 1.10.1 (acabo de notar que podría haber una actualización aquí a 1.11.05, lo comprobaré). EDIT: actualizado a gdal 1.11.0 - mismo problema de bucle infinito.