Lettura e scrittura dei dati nel Realtime Database con la CLI Firebase

Un po’ di tempo fa David East ha scritto un post molto utile su come utilizzare la CLI Firebase per leggere e scrivere il Firebase Realtime Database. La CLI si è evoluta molto da allora, quindi mi piacerebbe parlare di cosa è cambiato nel frattempo (e delle novità!).

Quando ho iniziato a lavorare con Realtime Database, trascorrevo una discreta quantità di tempo alla Console Firebase per inserire manualmente i dati necessari. È divertente apportare modifiche lì perché puoi vederle immediatamente nell’app! Ma mi sono accorto subito che era un po’ ripetitivo e questo tipo di testing richiedeva tempo. In alternativa avrei potuto scrivere un programma che apportava autonomamente le modifiche, ma non era un’opzione molto flessibile. Per facilitare la lettura e la scrittura dei dati nel database, ho capito che l’opzione migliore era la CLI Firebase. Ecco perché parlerò di questo e di come può essere utile. Tutti i miei esempi si riferiscono alla shell Bash, quindi forse saranno necessarie modifiche per le altre shell.

Operazioni preliminari

La CLI di Firebase ti richiede di mettere da parte una directory del progetto, accedere e selezionare il progetto desiderato, quindi assicurarti di seguire le istruzioni per impostare bene il progetto esistente.

Scrittura dei dati

Per scrivere i dati dalla riga di comando, utilizza firebase database:set:

firebase database:set /import data.json

Il primo argomento per database:set è il percorso da scrivere all’interno del database (qui /import) e il secondo è il file JSON da cui leggere. Se non hai un file e preferisci fornire il JSON alla riga di comando, puoi farlo anche con il flag --data:

firebase database:set /import --data '{"foo": "bar baz"}'

È da notare che JSON per la riga di comando presenta le virgolette singole. Altrimenti, lo spazio tra i due punti e la “barra” potrebbe far pensare alla tua shell che ci siano due argomenti. Non puoi usare le virgolette neanche per questa stringa JSON, perché JSON usa le virgolette per le proprie stringhe. Evitare JSON per una riga di comando Unix può essere complicato, quindi fai attenzione! (Non solo, ma cosa accadrebbe se ci fosse una sola virgoletta in una delle stringhe JSON?)

Puoi anche inviare pipe o reindirizzare JSON a stdin. Quindi, se hai un programma che genera i JSON da aggiungere al tuo database, puoi farlo in questo modo:

echo '{"foo": "bar baz"}' | firebase database:set /import --confirm 

Nota che il flag --confirm viene messo qui per impedire al comando di chiederti di confermare di voler potenzialmente sovrascrivere i dati. Senza, l’invio pipe a stdin non funzionerà!

Il comando database:set è ottimo per popolare il database all’inizio con uno script di installazione. Se esegui test di integrazione automatici, la CLI è un modo pratico di eseguire lo script per l’inizializzazione dell’ambiente di testing.

È anche molto utile per attivare rapidamente i trigger database di Cloud Functions, così non devi digitare dati al prompt del comando ogni volta che hai qualcosa di complicato da testare.

Lettura dei dati

Anche la lettura dei dati dal tuo database è piuttosto semplice grazie alla CLI Firebase. Ecco come recuperare tutti i dati in /messages sotto forma di blob JSON:

firebase database:get /messages

Per salvare l’output in un file, puoi utilizzare un reindirizzamento della shell o il flag –output:

firebase database:get /messages > messages.json
firebase database:get /messages --output messages.json

Noterai che l’output JSON è ottimizzato per lo spazio, il che rende difficile la lettura. Per un’opzione più leggibile, puoi usare l’output “pretty-printed”:

firebase database:get /messages --pretty

Puoi anche ordinare e limitare i dati proprio come le API del client Firebase.

firebase database:get /messages --order-by-value date

Per conoscere tutte le opzioni di lettura e ordinamento, consulta la guida CLI (tutti i comandi CLI di Firebase condividono il loro utilizzo in questo modo):

firebase database:get --help

Push dei dati

Probabilmente hai utilizzato la funzione push del Realtime Database per aggiungere dati a un nodo del tuo database. Puoi fare lo stesso con la CLI:

firebase database:push /messages --data '{"name":"Doug","text":"I heart Firebase"}'

Ciò creerà un ID push univoco in /messages e aggiungerà lì i dati (sapevi che da poco gli ID push non iniziano più con “-K” ma con “-L”?).

Aggiornamento dei dati

Se desideri aggiornare alcuni valori in una posizione senza sovrascriverla tutta, usa database:update:

firebase database:update /users/-L-7Zl_CiHW62YWLO5I7 --data '{"name":"CodingDoug"}'

Eliminazione dei dati

Per quelle volte in cui è necessario rimuovere qualcosa completamente, c’è database:remove. Questo comando spazzerà via l’intero database, incondizionatamente, un po’ come rm -rf /, quindi fai attenzione a:

firebase database:remove / --confirm

Copia dei dati tra progetti

A volte potresti voler semplicemente copiare il contenuto del tuo database da un progetto a un altro (ad esempio, il tuo ambiente di sviluppo in staging). Puoi effettuarlo facilmente con l’invio pipe di stdout di database:get allo stdin di database:set:

firebase --project myproject-dev database:get / | 
firebase --project myproject-staging database:set / --confirm

Qui è da notare l’uso di --project per specificare quale progetto Firebase debba essere usato per la lettura e scrittura. Questo è l’ID univoco del progetto nella Console Firebase.

Scorciatoia con le funzioni bash

Se ti ritrovi a ripetere un set di comandi, probabilmente è arrivato il momento di creare una funzione bash. Salva la tua funzione in .bash_profile e sarai in grado di accedervi da qualsiasi posizione nella riga di comando della shell.

Copi spesso i dati tra database? La funzione qui sotto rende questa operazione facile:

function transfer_to() {
local src_db="${1}"
local dest_db="${2}"
local path="${3:-/}"
firebase database:get --project "$src_db" "$path" | firebase --project "$dest_db" database:set "$path" --confirm
}

Per usare la funzione basta chiamare il comando transfer_to (come se fosse un qualsiasi altro comando) con i nomi del progetto da cui e a cui copiare:

transfer_to myproject-dev myproject-staging

Un po’ di creatività!

La riga di comando è uno degli strumenti più versatili nella cassetta degli attrezzi di un programmatore. Come stai usando la CLI? Non vediamo l’ora di ricevere tue notizie su Twitter. Se hai domande tecniche, pubblicale su Stack Overflow con il tag firebase. Per le segnalazioni di bug e richieste di funzionalità, ti preghiamo di usare questo modulo.