Artigo original: How to Get Started with Firebase Using Python

Este artigo é um guia detalhado que ajudará você a configurar seu banco de dados do Firebase e a executar operações CRUD simples com ele usando o Python.

O Firebase, como você deve saber, é uma plataforma oferecida pelo Google para acelerar o desenvolvimento de aplicações. Ele oferece BaaS, ou back-end como serviço, o que significa que o Firebase cuida da infraestrutura de nuvem e de todas as suas necessidades de back-end. Isso permite desenvolver e implementar mais rapidamente.

O Firebase oferece vários produtos incríveis, como o Realtime Database (banco de dados em tempo real), a Cloud Firestore (nuvem Firestore) e Authentication (autenticação). Também permite hospedagem e oferece APIs para tarefas de aprendizagem de máquina, como reconhecimento de texto, rotulagem de imagens e muito mais!

Vá até o site deles e se encante com as opções disponíveis.

Como configurar o Realtime Database do Firebase

Crie um projeto no Firebase – vamos chamá-lo de BookStoreProject (projeto de loja de livros). Depois de configurado, crie um Realtime Database selecionando a opção Create Database (criar banco de dados).

pic-1
Criação de um Realtime Database com o console do Firebase

Ao clicar em Create Database, você deve especificar a localização do banco de dados e as regras de segurança. Duas regras estão disponíveis:

  • locked mode (modo bloqueado), que nega todas leituras e gravações no banco de dados e
  • test mode (modo de teste), que permite acesso de leitura e gravação por um período padrão de 30 dias (após o qual todas as leituras e gravações são negadas, a menos que as regras de segurança sejam atualizadas).

Como usaremos o banco de dados para leitura, gravação e edição escolheremos o test mode. Feito isso, o banco de dados está pronto para o nosso uso!

Como gravar no Firebase Realtime Database usando Python

O próximo passo é descobrir como podemos nos conectar com o nosso banco de dados usando Python. Vamos usar a API Admin Database. Você precisará instalar a biblioteca necessária.

Para obter mais informações sobre como usar o firebase_admin para Python, confira a documentação oficial aqui (documentação em inglês).

pip install firebase_admin

Para se conectar ao Firebase, precisamos das seguintes linhas de código:

import firebase_admin

cred_obj = firebase_admin.credentials.Certificate('....path to file')
default_app = firebase_admin.initialize_app(cred_object, {
	'databaseURL':databaseURL
	})

No entanto, para fazer o código funcionar precisamos de alguns pré-requisitos.

Primeiro, precisamos especificar o caminho para uma chave de conta de serviço (em inglês, Service Account Key), que será usada para inicializar o admin SDK.

O Firebase permitirá o acesso às APIs do servidor Firebase a partir das contas de serviço do Google. Para autenticar a conta de serviço, é necessária uma chave privada no formato JSON.

O caminho para esse arquivo JSON deve ser fornecido para criar o objeto de credenciais. Para gerar a chave, vá até as configurações do projeto (Project Settings, em inglês), clique em gerar nova chave privada (Generate new private key, em inglês), baixe o arquivo e coloque-o em sua estrutura de diretórios.

image-205
Project Settings no console do Firebase

Para um explicação mais detalhada sobre esse processo, consulte a documentação oficial aqui (documentação em inglês).

Em seguida, precisamos de databaseURL, que é simplesmente o URL que dá acesso ao nosso banco de dados. Ele está presente na própria página do Realtime Database no console do Firebase.

Como gravar usando a função set()

from firebase_admin import db

ref = db.reference("/")

Definimos a referência para a root (raiz) do banco de dados (ou também podemos defini-la como um par chave-valor, ou como um par chave-valor filho). A pergunta que surge naturalmente é: qual esquema é permitido para armazenar dados em banco de dados de tempo real?

Todos os dados a serem armazenados devem estar no formato JSON, ou seja, uma sequência de pares chave-valor. Se você precisar de uma chave gerada pelo sistema, poderá optar por usar a função push(), que abordaremos em breve.

Vamos criar um JSON adequado que pode ser salvo no banco de dados. Temos informações sobre quatro livros da seguinte maneira:

{
	"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
	}
}

Carregamos o arquivo JSON necessário e salvamos os dados no banco de dados assim:

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

O banco de dados agora tem esta aparência:

image-207
Esquema do banco de dados, visto a partir do console do Firebase

Como gravar usando a função push()

O Firebase nos fornece a função push(), que salva dados em uma chave única gerada pelo sistema. Esse método garante que, se várias gravações estiverem sendo executadas na mesma chave, elas não serão substituídas.

Por exemplo, se várias fontes tentarem fazer uma gravação em /Books/Best_Sellers/, então qualquer que seja a fonte que fizer a ultima gravação, esse valor persistirá no banco de dados. Isso introduz a possibilidade de dados serem sobrescritos. push() resolve esse problema usando chaves exclusivas para cada novo "filho" adicionado.

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 do banco de dados após a execução do método push()

Observe que push() e set() não são atômicos. Isso significa que não há garantia que ambas as funções serão executadas juntas sem interrupção como uma única unidade indivisível.

Enquanto o banco de dados está sendo atualizado, se tentarmos buscar os dados, pode acontecer que push() tenha terminado, mas set() ainda não. Então, o JSON que recebemos terá uma chave gerada pelo sistema sem um campo de valor.

Como atualizar seu banco de dados do Firebase com Python

Atualizar o banco de dados é tão simples quanto definir a referência no ponto necessário e usar a função update(). Digamos que o preço dos livros de J. R. R. Tolkien seja reduzido para 80 para oferecer um desconto.

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 do banco de dados após o uso da função update()

Como recuperar dados do Firebase usando Python

Já recuperamos dados usando o método get() quando tentamos atualizar uma chave específica. Agora, veremos mais alguns métodos e agrupamentos para fazer consultas mais complexas.

Vamos colocar todos os livros em ordem, classificando-os por preço usando o método order_by_child(). Para aplicar esse método, primeiramente, temos que definir a chave pela qual estamos ordenando como o campo de índice por meio da regra .indexOn nas regras de segurança do Firebase.

Se quisermos classificar por preço, o preço deve ser listado como índice. Você pode definir o valor assim:

image-210
Vá para a aba Rules (regras) e insira a estrutura do esquema na qual você deseja definir o índice
ref = db.reference("/Books/Best_Sellers/")
print(ref.order_by_child("Price").get())

O valor de retorno do método é um OrderedDict. Para ordenar por chave, use order_by_key(). Para obter o livro com o maior preço, utilizamos o método limit_to_last(), da seguinte maneira:

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

Como alternativa, para obter o livro com menor preço, escrevemos:

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

Para obter livros com preço igual a 80, usamos:

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

Para mais exemplos e métodos de consulta do banco de dados de acordo com seus requisitos, confira a documentação oficial aqui (documentação em inglês).

Como excluir dados do Firebase usando Python

Excluir dados é bem simples. Vamos excluir todos os livros mais vendidos que tenham 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 do banco de dados após a exclusão

Conclusão

Neste artigo, aprendemos como criar um banco de dados usando o Realtime Database do Firebase, como preenchê-lo com dados, excluir, atualizar e consultar os dados usando Python.

Espero poder ter ajudado os desenvolvedores em Python que acabaram de descobrir a utilidade do Firebase, mas que também estão se sentindo sobrecarregados com tantas opções e métodos diferentes para escolher. Se você leu até aqui, muito obrigada! Cuide-se e divirta-se programando!