[Gfoss] problemi con indici spaziali sqlite
Andrea Peri
aperi2007 a gmail.com
Gio 20 Feb 2014 22:09:42 CET
Il giorno 20 febbraio 2014 21:44, Luca Lanteri <mescal72 a gmail.com> ha
scritto:
> grazie Sandro e Andrea per gli ottimi riferimenti da cui partire
>
>
> Il giorno 20 febbraio 2014 16:34, <a.furieri a lqt.it> ha scritto:
>
> On Thu, 20 Feb 2014 16:18:50 +0100, Luca Lanteri wrote:
>>
>>> Quello che però ho visto è che mi si è ripresentata più volte la
>>> necessità di dover ricreare gli indici perché il DB funzionasse
>>> correttamente, in particolare su una tavola dove la geometria non
>>> veniva inserita da qgis ma calcolata mediante un trigger sulla base di
>>> un'altra geometria.
>>>
>>>
>> e probabilmente l'intoppo e' proprio qua.
>> su SpatiaLite le geometrie devono sempre venire create invocando la
>> funzione SQL AddGeometryColumn() [oppure RecoverGeometryColumn()],
>> perche' e' l'unico modo sicuro per garantire che tutti i Triggers
>> necessari vengano creati nel modo corretto.
>> qualsiasi geometria che invece venga semplicemente creata andando
>> ad inserire direttamente una riga su "geometry_columns" risultera'
>> inevitabilmente "zoppa".
>> proprio perche' in questo modo verra' a mancare il supporto dei
>> Triggers, che e' assolutamente idispensabile per assicurare il
>> corretto aggiornamento degli R*Trees ogni volta che si effettua
>> una INSERT / UPDATE / DELETE.
>>
>
>
Infatti anche io credo che sia un problema di triggers.
> Io creo la colonna della geometria con RecoverGeometryColumn(),
>
No, la recovery funziona se hai creato la tabella con un comando del tipo:
create table pippo as select campo1,campo2,...,geometria from pluto;
inoltre stai attento che se scrivi:
create table pippo as select * from pluto;
non funziona bene.
sempre meglio esplicitare i nomi dei campi, mai affidarsi alla scorciatoia
" * "
Quindi se tu avessi fatto qualcosa del tipo:
create table pippo (campo 1 integer, campo 2 blob);
e poi gli applichi una :
select recoverygeometrycolumn('pippo','geometria',...);
probabilmente è qui che vi è il problema.
La procedura corretta è creare la tabella senza il campo "geometria" e poi
aggiungerlo con la sintassi:
select Addgeometrycolumns(....);
> poi popolo semplicemente i dati mediante un update della colonna
> geometrica, prendendo la geometria da un'atra tabella invece che
> dall'interfaccia di qgis. I trigger che popolano gli indici dovrebbero
> essere scatenati tanto dal mio update quanto da un inserimento diretto in
> QGIS, no ?
>
> Spero che cosi sia, visto che sto utilizzando Sqlite proprio per poter
> utilizzare le funzionalità dei trigger.
>
>
Avrei una altra ipotesi al riguardo.
Una ipotesi che mi deriva da un episodio che ho affrontato qualche
settimana fa'.
In tale occasione , avevo definito un trigger su un db spatialite, per
garantire che a fronte di certi valori su un campo, venisse popolato altri
campi.
Quando andavo a popolare questo db con qgis, mi accorsi che in realta' il
trigger non si scatenava.
Purtroppo non ho ulteriormente indagato.
Presi atto che non funzionava, forse avevo sbagliato a definire il trigger,
forse era qgis che non funzizonava, fatto sta' che scelsi di seguire altre
strade e decisi di non indagare oltre.
Avrei dovuto, ma non avevo proprio il tempo.
Mi sono ricordato di quell'episodio ora, che leggo del tuo caso.
Forse potrebbe essere un ulteriore indizio che
Il codice del provider sqlite di qgis potrebbe essere stato modificato per
non scatenare i triggers.
O forse solo alcuni di essi.
(sigh)
Sicuramente è da verificare.A questo punto vedo di fare qualche prova in
questo fine settimana.
Andrea.
-------------- parte successiva --------------
Un allegato HTML ? stato rimosso...
URL: <http://lists.gfoss.it/pipermail/gfoss/attachments/20140220/9beb8f63/attachment.html>
Maggiori informazioni sulla lista
Gfoss