Como usar o Cloud Firestore no modo Datastore

O Firestore é um banco de dados de documentos NoSQL criado para fornecer escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicativos. O Firestore é a mais nova versão do Datastore e apresenta várias melhorias em relação a ele.

Como o Firestore no modo Datastore é otimizado para casos de uso do servidor e para o App Engine, recomendamos o uso do Firestore no modo Datastore para bancos de dados que serão usados principalmente por aplicativos do App Engine. O Firestore no modo nativo é mais útil para casos de uso de notificações móveis e em tempo real. Para mais informações sobre os modos do Firestore, consulte Como escolher entre o modo nativo e o modo Datastore.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud para armazenar e recuperar dados em um banco de dados no modo Datastore.

Pré-requisitos e configuração

Siga as instruções sobre o "Hello, World!" para Python para configurar o ambiente e o projeto, além de compreender a estrutura de apps do Python no App Engine. Anote e salve o ID do projeto. Você precisará dele para executar o app de amostra descrito neste documento.

Clonar o repositório

Faça o download ou clone da amostra:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/datastore

Editar a configuração do projeto e definir as dependências

Inclua a biblioteca google-cloud-datastore em requirements.txt. Esta é a biblioteca de cliente para o modo Datastore.

Flask==2.1.0; python_version > '3.6'
Flask==2.0.3; python_version < '3.7'
google-cloud-datastore==2.7.1
gunicorn==20.1.0

Código do aplicativo

O aplicativo de amostra registra, recupera e exibe IPs de visitantes. A entrada de registro é uma classe de dois campos simples que recebe o tipo visit e é salva no modo Datastore com o comando put (em inglês). Em seguida, as 10 visitas mais recentes são recuperadas em ordem decrescente usando o comando query().

@app.route('/')
def index():
    ds = datastore.Client()

    user_ip = request.remote_addr

    # Keep only the first two octets of the IP address.
    if is_ipv6(user_ip):
        user_ip = ':'.join(user_ip.split(':')[:2])
    else:
        user_ip = '.'.join(user_ip.split('.')[:2])

    entity = datastore.Entity(key=ds.key('visit'))
    entity.update({
        'user_ip': user_ip,
        'timestamp': datetime.datetime.now(tz=datetime.timezone.utc)
    })

    ds.put(entity)
    query = ds.query(kind='visit', order=('-timestamp',))

    results = []
    for x in query.fetch(limit=10):
        try:
            results.append('Time: {timestamp} Addr: {user_ip}'.format(**x))
        except KeyError:
            print("Error with result format, skipping entry.")

    output = 'Last 10 visits:\n{}'.format('\n'.join(results))

    return output, 200, {'Content-Type': 'text/plain; charset=utf-8'}

Como usar arquivos index.yaml

O app de exemplo faz consultas simples. Consultas mais elaboradas do modo Datastore exigem um ou mais índices, que você precisa especificar em um arquivo index.yaml enviado com o aplicativo. Esse arquivo pode ser criado ou gerado automaticamente ao testar seu aplicativo localmente.

Teste local

Se precisar desenvolver e testar seu aplicativo localmente, é possível usar o emulador de modo Datastore.

Para saber mais

Para informações completas sobre o modo Datastore, incluindo otimizações e conceitos, veja a documentação do Cloud Firestore no modo Datastore.