My favorites | Português | Sign in

Visão geral da API de armazenamento de dados em Python

O armazenamento de dados do Google App Engine fornece armazenamento dimensionável e robusto de dados para o seu aplicativo da web. O armazenamento de dados é desenvolvido tendo em mente os aplicativos da web, com ênfase no desempenho de leitura e consulta. Ele armazena entidades de dados com propriedades, organizadas de acordo com tipos definidos por aplicativos. Pode executar consultas em entidades do mesmo tipo, com filtros e ordens de classificação em valores e chaves da propriedade. Todas as consultas são pré-indexadas para proporcionar resultados mais rápidos em conjuntos de dados muito grandes. O armazenamento de dados suporta atualizações transacionais, usando agrupamentos de entidade definidos pelo aplicativo como a unidade de transacionalidade na rede de dados distribuída.

Apresentação do armazenamento de dados

O armazenamento de dados do Google App Engine armazena e executa consultas sobre objetos de dados conhecidos como entidades. Uma entidade tem uma ou mais propriedades, valores nomeados em um de diversos tipos de dados suportados. Uma propriedade pode ser uma referência a outra entidade.

O armazenamento de dados pode executar diversas operações em uma única transação e reverter a transação inteira em caso de falha de uma das operações. Isso é particularmente útil para os aplicativos de web distribuídos, nos quais diversos usuários podem acessar ou manipular o mesmo objeto de dados ao mesmo tempo.

Diferente dos bancos de dados tradicionais, o armazenamento de dados utiliza uma arquitetura distribuída para gerenciar o dimensionamento para conjuntos de dados muito grandes. Um aplicativo do Google App Engine pode otimizar a distribuição dos dados, descrevendo os relacionamentos entre os objetos de dados e definindo índices para as consultas.

O armazenamento de dados do Google App Engine é bastante consistente, mas não é um banco de dados relacional. Embora a interface do armazenamento de dados tenha diversos recursos similares aos dos bancos de dados tradicionais, suas características exclusivas sugerem uma maneira diferente de projetar e gerenciar os dados, para tirar proveito da capacidade de dimensionamento automático.

Modelagem de dados com Python

As entidades do armazenamento de dados não têm esquema: duas entidades do mesmo tipo não são obrigadas a ter as mesmas propriedades ou usar os mesmos tipos de valores para as mesmas propriedades. O aplicativo é responsável por garantir que as entidades atendam ao esquema quando necessário. Para isso, o SDK para Python inclui uma biblioteca complexa de recursos de modelagem de dados que facilita a imposição de um esquema.

Na API em Python, um modelo descreve um tipo de entidade, incluindo os tipos e a configuração de suas propriedades. Um aplicativo define um modelo utilizando classes Python, com atributos de classe descrevendo as propriedades. As entidades de um tipo são representadas por instâncias da classe model correspondente, com atributos de instâncias representando os valores de property. Uma entidade pode ser criada com uma chamada para o construtor da classe e, em seguida, armazenada com uma chamada do método put().

import datetime
from google.appengine.ext import db
from google.appengine.api import users

class Employee(db.Model):
  name = db.StringProperty(required=True)
  role = db.StringProperty(required=True, choices=set(["executive", "manager", "producer"]))
  hire_date = db.DateProperty()
  new_hire_training_completed = db.BooleanProperty()
  account = db.UserProperty()

e = Employee(name="",
             role="manager",
             account=users.get_current_user())
e.hire_date = datetime.datetime.now()
e.put()

A API de armazenamento de dados fornece duas interfaces para consultas: uma interface de objeto de consulta e uma linguagem de consulta semelhante a SQL denominada GQL. Uma consulta retorna entidades na forma de instâncias da classe model, que podem ser modificadas e recolocadas no armazenamento de dados.

training_registration_list = [users.User("Alfred.Smith@example.com"),
                              users.User("jharrison@example.com"),
                              users.User("budnelson@example.com")]
employees_trained = db.GqlQuery("SELECT * FROM Employee WHERE account IN :1",
                                training_registration_list)
for e in employees_trained:
    e.new_hire_training_completed = True
    db.put(e)

Entidades e propriedades

Um objeto de dados do armazenamento de dados do Google App Engine é conhecido como entidade. Uma entidade tem uma ou mais propriedades, valores nomeados em um de diversos tipos de dados, incluindo números inteiros, valores de ponto flutuante, strings, datas, dados binários e muito mais.

Cada entidade também tem uma chave exclusiva que a identifica. A chave mais simples tem um tipo e um ID numérico exclusivo fornecido pelo armazenamento de dados. O ID também pode ser uma string fornecida pelo aplicativo.

Para obter uma entidade do armazenamento de dados, um aplicativo pode utilizar a sua chave ou realizar uma consulta correspondente às propriedades da entidade. Uma consulta pode retornar zero ou mais entidades e os resultados classificados por valores de propriedade. Uma consulta também pode limitar o número de resultados retornados pelo armazenamento de dados, para economizar memória e tempo de execução.

Diferente dos bancos de dados relacionais, o armazenamento de dados do Google App Engine não requer que todas as entidades de um determinado tipo tenham as mesmas propriedades. O aplicativo pode especificar e impor seu modelo de dados usando bibliotecas incluídas com o SDK ou seu próprio código.

Uma propriedade pode ter um ou mais valores. Uma propriedade com diversos valores pode ter valores de tipos mistos. Uma consulta sobre uma propriedade com diversos valores testa se algum desses valores atende aos critérios da consulta. Isso torna essas propriedades úteis para teste de associação.

Consultas e índices

Uma consulta do armazenamento de dados do Google App Engine opera em toda entidade de um determinado tipo (uma classe de dados). Ela especifica zero ou mais filtros nos valores e chaves da propriedade da entidade e zero ou mais ordens de classificação. Uma entidade retorna como um resultado de uma consulta se tiver no mínimo um valor (possivelmente nulo) para cada propriedade mencionada nos filtros e ordens de classificação da consulta, e se todos os critérios do filtro forem atendidos pelos valores da propriedade.

Cada consulta do armazenamento de dados utiliza um índice, uma tabela que contém os resultados da consulta na ordem desejada. Um aplicativo do Google App Engine define seus índices em um arquivo de configuração. O servidor da web para desenvolvimento adiciona sugestões a este arquivo automaticamente, ao encontrar consultas que ainda não têm índices configurados. Você pode ajustar os índices manualmente, editando o arquivo antes de enviar o aplicativo. À medida que o aplicativo faz alterações nas entidades do armazenamento de dados, este atualiza os índices com os resultados corretos. Quando o aplicativo executa uma consulta, o armazenamento de dados obtém os resultados diretamente do índice correspondente.

Esse mecanismo suporta uma ampla variedade de consultas e é adequado para a maioria dos aplicativos. Entretanto, ele não suporta alguns tipos de consultas que você pode ter o costume de fazer em outras tecnologias de banco de dados.

Transações e grupos de entidades

No armazenamento de dados do Google App Engine, qualquer tentativa de criar, atualizar ou excluir uma entidade ocorre em uma transação. Uma transação garante que toda alteração feita na entidade seja salva no armazenamento de dados, ou, no caso de uma falha, nenhuma das alterações seja feita. Isso garante a consistência dos dados em uma entidade.

Você pode executar diversas ações em uma entidade dentro de uma única transação usando a API de transação. Por exemplo, se você quiser incrementar um campo de contador em um objeto. Para fazer isso, você precisa ler o valor do contador, calcular o novo valor e armazená-lo. Sem uma transação, outro processo pode incrementar o contador entre o momento em que você lê o valor e o momento em que você o atualiza, fazendo com que o aplicativo sobrescreva o valor atualizado. A execução da leitura, cálculo e gravação em uma única transação garante que nenhum outro processo interfira na incrementação.

Você pode fazer alterações em diversas entidades dentro de uma única transação. Para suportar isso, o Google App Engine precisa saber com antecedência quais entidades serão atualizadas juntas, para que ele as armazene de uma maneira que possibilite as transações. Ao criar uma entidade, você precisa declarar que uma entidade pertence ao mesmo grupo de entidades que outra entidade. Todas as entidades obtidas, criadas, atualizadas ou excluídas em uma transação devem obrigatoriamente estar no mesmo grupo de entidades.

Grupos de entidades são definidos por uma hierarquia de relacionamentos entre entidades. Para criar uma entidade em um grupo, você declara que a entidade é uma filha de outra entidade já existente no grupo. A outra entidade é o pai. Uma entidade criada sem um pai é uma entidade raiz. Uma entidade raiz sem qualquer filha existe em um grupo de entidades por si só. Cada entidade tem um caminho de relacionamentos pai-filha desde uma entidade raiz até ela mesma (o caminho mais curto é sem a existência de pai). Esse caminho é uma parte essencial da chave completa da entidade. Uma chave completa pode ser representada pelo tipo e ID ou pelo nome da chave de cada entidade no caminho.

O armazenamento de dados usa a concorrência otimista para gerenciar transações. Enquanto uma instância do aplicativo aplica as alterações nas entidades em um grupo de entidades, todas as outras tentativas de atualização de qualquer entidade no grupo falham instantaneamente. O aplicativo pode tentar a transação novamente para aplicá-la aos dados atualizados.

Cotas e limites

Cada chamada para a API do armazenamento de dados conta para a cota de Chamadas da API do armazenamento de dados. Observe que algumas chamadas da biblioteca resultam em diversas chamadas para a API de armazenamento de dados subjacente.

Os dados enviados para o armazenamento de dados pelo aplicativo contam para a cota de Dados enviados para a API (armazenamento de dados). Os dados recebidos pelo aplicativo do armazenamento de dados contam para a cota de Dados recebidos da API (armazenamento de dados).

A quantidade total de dados armazenados atualmente no armazenamento de dados para o aplicativo não pode exceder a cota de Dados armazenados (ajustável). Isso inclui propriedades e chaves da entidade, mas não inclui índices.

A quantidade de tempo de CPU consumida pelas operações do armazenamento de dados se aplica às seguintes cotas:

  • Tempo da CPU (ajustável)
  • Tempo da CPU do armazenamento de dados

Para obter mais informações sobre cotas, consulte Cotas e a seção "Detalhes da cota" do Console de administração.

Além das cotas, os limites a seguir são aplicados ao uso do armazenamento de dados:

Limite Quantidade
tamanho máximo da entidade 1 megabyte
número máximo dos valores em um índice de uma entidade (1) 1.000 valores
número máximo de entidades em uma batch put ou batch delete 500 entidades
número máximo de entidades em uma batch get 1.000 entidades
desvio máximo de resultados para uma consulta 1.000
  1. Uma entidade usa um valor em um índice para cada coluna × cada linha que se refere à entidade, em todos os índices. O número de valores de índices de uma entidade pode crescer se uma propriedade indexada tiver vários valores, exigindo diversas linhas com valores repetidos na tabela.