DUPLICARE IL DATABASE DI UN PROGETTO QGIS, MA SENZA DATI

DUPLICARE IL DATABASE DI UN PROGETTO QGIS, MA SENZA DATI

Alberto Vallortigara

Il tutto è iniziato perché avevo preparato un piccolo progetto con QGIS ed un database in formato Geopackage che volevo duplicare. Il progetto lo avevo testato inserendo dei dati e ora avevo la necessità di averlo "pulito".

Come fare?

QGIS sembra non offra plugins o processi per fare questo in automatico; sulla rete non ho trovato nulla di specifico che mi spiegasse come fare; come se non bastasse il formato Geopackage non è il più adatto per queste operazioni.

Prendendo spunto da un sito internet (scusate, ma non ricordo più quale) in cui si spiegava come recuperare un db .gpkg corrotto, ho pensato bene di fare alcune prove, sia con Geopackage che con Spatialite.

In entrambi i casi è necessario (o quantomeno fortemente consigliato) utilizzare una interfaccia grafica per i database SQLite (sia Spatialite che Geopackage sono basati su SQLite). Io ho usato DB Browser.

Soluzione con SPATIALITE

La soluzione con Spatialite mette a disposizione la sua interfaccia grafica (Spatialite GUI).

Spatilite GUI

Si inizia aprendo il database gpkg con DB Browser e, molto semplicemente, si esportano le tabelle interessate in formato SQL.

Nel menù a discesa "File" -> Esporta -> Database in file SQL ...

Si aprirà questa finestra di esportazione, dalla quale scegliere le tabelle da esportare usando l'elenco predisposto, esportare tutto o solo lo schema (a noi interessa solo lo schema e non i dati) e scegliere se mantenere lo schema esistente o crearne uno nuovo (io l'ho mantenuto).

Esporta in SQL

Si devono esportare solo le tabelle create da noi, tralasciando quelle che iniziano con gpkg_.

Fatto questo, usiamo un qualsiasi editor di testo per eliminare la riga della geometria in tutte le tabelle in cui è presente (non preoccupatevi, verrà ricreata in seguito).

Sempre con l'uso di un editor di testo, all'interno del file SQL, dovremo inserire il comando SELECT AddGeometryColumn() con i relativi parametri.

Per ogni tabella creata in SQL che contenga una geometria, al termine dei comandi di creazione della tabella (conclusi con ";"), è necessario introdurre il comando:

SELECT AddGeometryColumn('nome_tabella','nome_colonna_geom',SRID,tipo-geom,'XY');

dove tipo-geom si riferisce alla geometria che deve contenere il layer (nel mio caso era POINT). (Maggiori riferimenti ed esempi si possono trovare nella pubblicazione di Alessandro Furieri "Spatialite CookBook").

Completata la correzione del file SQL, si passa a Spatialite GUI (per comodità, siete liberi di provare anche da linea di comando).

Dall'interfaccia di Spatialite è sufficiente creare un nuovo database e, nella finestra del codice SQL a destra, inserire il file SQL ricavato da DB Browser e corretto come visto.

A questo punto il database è pulito e pronto per essere caricato in QGIS.

SOLUZIONI CON GEOPACKAGE

A differenza di quanto fatto con Spatialite, in questo caso dobbiamo lavorare direttamente del file gpkg, quindi è quanto meno opportuno e consigliato fare una copia di riserva.

Sebbene il formato gpkg utilizzi SQLite come Spatialite, non riconosce il comando AddGeometryColumn, quindi non è possibile creare le geometrie usando SELECT come abbiamo visto più su.

Da un po' di tempo Spatialite è in grado di creare la struttura del formato gpkg, ma dalle prove che ho fatto io non vengono stabilite le connessioni fra le tabelle, ergo non funziona nulla, sarete avvisati con una maschera di errore che mancano i collegamenti.

Non resta da fare altro che lavorare su un db con già le connessioni valide.

Soluzione 1

Apriamo quindi il file gpkg con DB Browser e individuiamo le tabelle delle quali ci vogliamo liberare dei dati.

Per ognuna di queste tabelle, nella finestra SQL di DB Browser, dovremo usare il comando DELETE FROM nome_tabella. In questo modo vengono cancellati TUTTI i dati contenuti nella tabella, ma la tabella viene mantenuta e riconosciuta, in particolare la colonna della geometria (dove c'è, ovviamente).

Caricando in QGIS questo gpkg, ed inserendo nuove geometrie, vedremo che il loro ID (generalmente univoco ed autoincrementante) non partirà da 1, ma continuerà la numerazione precedente. Questo perchè i valori massimi sono stati registrati nella tabella sqlite_sequence, che è proprio deputata a questo scopo: continuare la numerazione.

Il rimedio è abbastanza veloce:

DELETE FROM sqlite_sequence (ovvero cancello tutti i dati contenuti nella tabella).

A questo punto il lavoro di ricostruzione dipende dal numero delle vostre tabelle, perchè la struttura di sqlite_sequence prevede l'inserimento del nome della tabella (la colonna si chiama name) e l'ultimo numero utilizzato (la colonna si chiama seq).

Pertanto per ripristinare la numerazione con partenza da 1, sempre dalla finestra SQL dovremo impartire il comando

INSERT INTO sqlite_sequence (name,seq) VALUES (nome_tabella, 0);

La riga va ripetuta cambiando di volta in volta nome_tabella con il valore corretto (non serve eseguire la riga una volta compilata, ma si possono scrivere tutte le righe ed eseguirle tutte insieme).

Mi raccomando non toccate le tabelle con nome tipo gpkg_nome_tabella.

A questo punto il Geopackage ripulito dovrebbe essere pronto per essere caricato in QGIS.

Soluzione 2

Apriamo il file gpkg con DB Browser ed individuiamo le tabelle delle quali ci vogliamo liberare dei dati.

A differenza della soluzione 1, questa volta esporteremo le tabelle senza dati in un file SQL. Quindi dovremo operare come visto per Spatialite: si inizia aprendo il database gpkg con DB Browser e, molto semplicemente, si esportano le tabelle interessate in formato SQL, compresa la tabella sqlite_sequence.

Dal menù a discesa "File" -> Esporta -> Database in file SQL ..., dall'elenco si scelgono le tabelle da esportare, si indica di esportare solo lo schema senza dati e, cosa importante, Sovrascrivi schema precedente.

Una volta creato il file SQL, tenendo aperto il database corrente, dalla sezione Esegui SQL, si apre e si esegue il file appena creato, che provvederà a cancellare e ricreare le tabelle senza dati (DROP TABLE IF EXIST e CREATE TABLE IF NOT EXIST).

La struttura del Geopackage (le tabelle che iniziano con gpkg_) verrà mantenuta e anche i collegamenti alle nostre tabelle, comprese quelle contenenti le geometrie.


Ovviamente, dato che quanto sopra riportato è stato testato solo da me e sui miei (scarsi) mezzi informatici, non mi assumo alcuna responsabilità in merito agli usi propri o impropri che vorrete fare del contenuto di questo post, come non sono e non sarò responsabile in alcun modo della possibile perdita dei vostri dati, per i quali siete caldamente invitati a fare una copia di riserva.

Rimane sempre e comunque a vostro carico, in ogni caso, la verifica della correttezza di quanto riportato.

Report Page