Original article: How to Get Started with Firebase Using Python

Este artículo es una guía detallada que te ayudará a configurar tu base de datos de Firebase y ejecutar simples operaciones de CRUD (Crear, Leer, Actualizar, Borrar) en ella usando Python.

Firebase, como podrías saber, es una plataforma de Google para acelerar el desarrollo de apps. Ofrece BaaS o backend como un servicio, lo cual significa que Firebase se encarga de la infraestructura de la nube y de todas tus necesidades de backend. Esto te permite desarrollar y publicar más rápido.

Firebase ofrece varios sorprendentes productos, tales como una base de datos en tiempo real, una nube de almacenamiento Firestore, y Autenticación. Y además permite el hosting y ofrece APIs para tareas de machine learning como el reconocimiento de texto, etiquetado de imágenes y ¡mucho más!

Dale un vistazo al sitio haciendo clic aquí y babea sobre las maravillosas opciones disponibles.

Como configurar una base de datos en tiempo real con Firebase

Cree un nuevo proyecto en Firebase – Nombrémoslo ProyectoLibrería (o BookstoreProject, en inglés). Una vez creado, se debe crear la base de datos a tiempo real seleccionando la opción crear base de datos (o create Database).

pic-1
Creando una base de datos a tiempo real usando la consola de Firebase

Cuando haces clic en crear base de datos, debes especificar la ubicación de la base de datos y las reglas de seguridad. Dos reglas están disponibles:

  • Modo bloqueado, el cual niega toda lectura o escritura en la base de datos, y
  • Modo de prueba, el cual permite el acceso a la lectura y la escritura por 30 días como opción por defecto (después de dicha fecha, todos los accesos a lectura y escritura a la base de datos serán bloqueados a no ser que las reglas de seguridad sean actualizadas).

Ya que estaremos usando la base de datos para leer, escribir y editar, seleccionamos el modo de prueba. Una vez terminado, la base de datos está lista para su utilización.

Como escribir en la base de datos en tiempo real de Firebase usando Python

El inmediato siguiente paso consiste en encontrar como podemos conectarnos a nuestra base de datos usando Python. Vamos a usar la API Admin Database. Requerirás instalar la librería solicitada.

Para más información en como usar firebase_admin para Python, revisa la documentación oficial aquí.

pip install firebase_admin

Para conectar con Firebase, necesitamos las siguientes líneas de código:

import firebase_admin

cred_obj = firebase_admin.credentials.Certificate('....dirección del archivo')
default_app = firebase_admin.initialize_app(cred_object, {
	'databaseURL':databaseURL
	})

Para hacer que el código funcione, sin embargo, necesitamos de algunos prerrequisitos.

Primero, necesitamos especificar la dirección a una clave de cuenta de servicio que será usada para inicializar el admin SDK.

Firebase permitirá el acceso al servidor de APIs de Firebase desde las cuentas de servicio de Google, y para ello requerimos de una clave privada en formato JSON.

La dirección a este archivo JSON debe ser entregada para crear el objeto de credencial. Para generar la clave, vamos a la configuración del proyecto, haz clic en generar una nueva clave privada, descarga el archivo, y alojarlo en su directorio.

image-205
Ajustes de Proyecto en la consola de Firebase

Para una explicación mucho más elaborada de este proceso, puedes revisar la documentación oficial aquí.

A continuación, necesitamos la URL de la base de datos, la cual es simplemente la URL que nos da acceso a nuestra base de datos. Está presente en la misma página consola de la base de datos a tiempo real de Firebase.

Como escribir con la función set()

from firebase_admin import db

ref = db.reference("/")

Configuramos la referencia a la raíz de la base de datos (o también podemos referenciarla a un valor clave o a un valor clave hijo). La pregunta que naturalmente aparece es, ¿qué esquema está soportado para almacenar datos en las bases de datos de tiempo real?

Toda la información almacenada debe estar en un formato JSON, esto es, una secuencia de parejas de valores clave. Si necesitas un sistema de claves generadas, podrías optar a utilizar la función push(), la cual cubriremos prontamente.

Vamos a construir un JSON adecuado para ser guardado en la base de datos. Tenemos información relacionada con libros como sigue:

{
	"Book1":
	{
		"Title": "The Fellowship of the Ring",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100
	},
	"Book2":
	{
		"Title": "The Two Towers",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100	
	},
	"Book3":
	{
		"Title": "The Return of the King",
		"Author": "J.R.R. Tolkien",
		"Genre": "Epic fantasy",
		"Price": 100
	},
	"Book4":
	{
		"Title": "Brida",
		"Author": "Paulo Coelho",
		"Genre": "Fiction",
		"Price": 100
	}
}

Cargamos el archivo JSON necesario y guardamos la información en la base de datos de la siguiente manera:

import json
with open("book_info.json", "r") as f:
	file_contents = json.load(f)
ref.set(file_contents)

La base de datos ahora debería verse así:

image-207
Esquema de la vista de la base de datos desde la consola de Firebase

Como escribir usando la función push()

Firebase nos entrega la función push() que guarda información bajo un sistema de generación de claves únicas. Este método asegura que si múltiples escrituras se están realizando bajo la misma clave, no se sobreescriban entre sí.

Por ejemplo, si múltiples fuentes tratan de escribir en /Books/Best_Sellers/ entonces, quien sea que haya realizado la última escritura o carga, dicha información es la que quedará registrada en la base de datos. Esto agrega la posibilidad de que la información puede ser sobreescrita.push() resuelve este problema al usar una clave única para cada hijo que sea agregado.

ref = db.reference("/")
ref.set({
	"Books":
	{
		"Best_Sellers": -1
	}
})

ref = db.reference("/Books/Best_Sellers")
import json
with open("book_info.json", "r") as f:
	file_contents = json.load(f)

for key, value in file_contents.items():
	ref.push().set(value)
image-208
Esquema de la base de datos después de ejecutar el método push()

Por favor, note que push() y set() no son atómicos. Es decir, no hay ninguna garantía de que ambas funciones se ejecutarán juntas sin interrupción como una única unidad indivisible.

Mientras la base de datos está siendo actualizada, si intentamos obtener la información, puede suceder que push() haya finalizado, pero set() no lo haya hecho aún – por lo que el JSON que recibiremos tendrá una clave generada por el sistema sin un valor.

Como actualizar tu base de datos Firebase usando Python

Actualizar la base de datos es tan simple como configurar la referencia en el punto requerido y usar la función update(). Digamos que el precio de los libros de J. R. R. Tolkien se han reducido a 80 unidades parar ofrecer un descuento.

ref = db.reference("/Books/Best_Sellers/")
best_sellers = ref.get()
print(best_sellers)
for key, value in best_sellers.items():
	if(value["Author"] == "J.R.R. Tolkien"):
		value["Price"] = 90
		ref.child(key).update({"Price":80})
        
        
image-209
Esquema de la base de datos luego de usar la función update()

Como recuperar información desde la base de datos Firebase usando Python

Ya hemos recuperado información usando el método get() cuando estábamos tratando de actualizar una clave en particular. Ahora, veremos unos cuantos métodos más y los agruparemos para realizar complejas solicitudes.

Vamos a obtener todos los libros en orden, ordenados según el precio usando el método order_by_child(). Para aplicar este método, en primer lugar debemos configurar la clave para la cual estamos realizando la solicitud como el campo índice mediante la regla .indexOn en las reglas de seguridad de Firebase.

Si queremos ordenar según precio, entonces el precio debe estar registrado como índice. Puedes colocar el valor así:

image-210
Ve a la pestaña reglas y escribe en la estructura del esquema donde quieras colocar el índice
ref = db.reference("/Books/Best_Sellers/")
print(ref.order_by_child("Price").get())

El valor retornado de este método es un OrderedDict. Para ordenar según clave, use order_by_key(). Para obtener el libro con el precio máximo, usamos el método limit_to_last() de la siguiente manera:

ref.order_by_child("Price").limit_to_last(1).get()

Por otro lado, para obtener el libro con el precio más bajo, escribimos lo siguiente:

ref.order_by_child("Price").limit_to_first(1).get()

Para obtener los libros que estén exactamente con el precio de 80 unidades, usamos lo siguiente:

ref.order_by_child("Price").equal_to(80).get()

Para más ejemplos y métodos para consultar su base de datos según sus necesidades, revise la documentación oficial aquí.

Como eliminar información de Firebase usando Python

Eliminar información es bastante simple. Vamos a eliminar todos los libros más vendidos con J.R.R. Tolkien como autor.

ref = db.reference("/Books/Best_Sellers")

for key, value in best_sellers.items():
	if(value["Author"] == "J.R.R. Tolkien"):
		ref.child(key).set({})
        
        
image-211
Esquema de la base de datos luego de eliminar información

Conclusión

En este post, hemos aprendido como crear una base de datos en tiempo real Firebase, llenarla con información, y borrarla, actualizar y consultar la información usando Python.

Espero esto ayude a algún desarrollador Python ahí fuera, quien está recientemente descubriendo la belleza de Firebase, pero se siente abrumado con tantas opciones y métodos para elegir. Si has leído hasta acá, ¡muchísimas gracias! Cuídese y ¡feliz codeo!