[Gfoss] Spatialite e spatial view

a.furieri a lqt.it a.furieri a lqt.it
Mar 6 Ott 2015 20:02:52 CEST


On Tue, 6 Oct 2015 14:57:45 +0200, pierluigi de rosa wrote:
> salve a tutti,
>
> sto cercando di riprodurre quanto facevo già con postgis in
> spatialite.
> Una cosa molto semplice ma stranamente non riesco nè con
> spatialite-gui ne da sql puro.
> Voglio creare una spatial view di buffer di 1km attorno a punti che
> sono già nel DB.
> Uso:
>
> CREATE VIEW "pippo11" AS
> SELECT "ROWID" AS "ROWID", "name" AS "name",
> ST_Buffer("Geometry",1000) AS "Geometry"
> FROM "bus_stop"
>
> Poi registro la view:
>
> INSERT INTO views_geometry_columns (view_name, view_geometry,
> view_rowid, f_table_name, f_geometry_column)
> VALUES ('pippo11', 'geometry', 'rowid', 'bus_stop', 'geometry')
> Ma mi dice che la tabella è del tipo read-only
> Dove sbaglio?
>

ciao Pierluigi,

non sbagli nulla; e' semplicemente che per definizione le Views
di SQLite sono sempre di tipo read-only.

se vuoi puoi anche trasformare una qualsiasi View di SQLite in
un oggetto dotato di piene capacita' read-write, ma in questo
caso pero' devi  anche provvedere ad installare dei Triggers
che intercettino gli eventi INSERT, UPDATE e DELETE rimappandoli
nel modo piu' opportuno.

una spiegazione piu' completa e dettagliata la trovia qua:
https://www.gaia-gis.it/fossil/libspatialite/wiki?name=writable-view

se vuoi renderti la vita molto piu' semplice puoi usare
SpatiaLite-GUI che supporta un wizard "Query/View composer"
che e' in grado di generarti automaticamente tutti i Triggers
che servono per ottenere una Spatial View "updatable".

infine, nota bene:
> INSERT INTO views_geometry_columns (view_name, view_geometry,
> view_rowid, f_table_name, f_geometry_column)
> VALUES ('pippo11', 'geometry', 'rowid', 'bus_stop', 'geometry')
>

questa notazione e' incompleta, ti stai mangiando una colonna;
la forma completa e' invece:
INSERT INTO views_geometry_columns (view_name, view_geometry,
    view_rowid, f_table_name, f_geometry_column, read_only)
VALUES ('pippo11', 'geometry', 'rowid', 'bus_stop', 'geometry', 1 | 0);

l'ultimo valore "read_only" e' proprio quello che QGIS usa
per stabilire se la tua View e' di tipo read-only oppure
read-write.
ovviamente se ti limiti a settare il valore "read_only=0" senza
installare correttamente tutti i Triggers di supporto QGIS
ti dara' un sacco di errori al primo tentativo che farai di
andare a fare qualche operazione di scrittura su quella View.

ciao Sandro


Maggiori informazioni sulla lista Gfoss