Nota: os programadores que criam novas aplicações são fortemente aconselhados a usar a biblioteca de cliente NDB, que tem várias vantagens em comparação com esta biblioteca de cliente, como o armazenamento em cache automático de entidades através da API Memcache. Se estiver a usar atualmente a biblioteca cliente DB mais antiga, leia o guia de migração de DB para NDB
O Datastore do App Engine suporta um conjunto fixo de tipos de valores para propriedades em entidades de dados.
Property
classes podem definir novos tipos que são convertidos para e a partir dos tipos de valores subjacentes, e os tipos de valores podem ser usados diretamente com
Expando
propriedades dinâmicas e
ListProperty
modelos de propriedades agregadas.
A tabela seguinte descreve as classes de propriedades cujos valores correspondem diretamente aos tipos de dados subjacentes. Qualquer um destes tipos de valores pode ser usado numa propriedade dinâmica Expando ou num tipo agregado ListProperty.
| Classe de propriedade | Tipo de valor | Ordenação |
|---|---|---|
IntegerProperty
|
int
long
(64 bits)
|
Numérico |
FloatProperty
|
float
|
Numérico |
BooleanProperty
|
bool
|
False < True |
StringProperty
|
str
unicode
|
Unicode (str é tratado como ASCII) |
TextProperty
|
db.Text
|
Nenhum |
ByteStringProperty
|
ByteString
|
Ordem dos bytes |
BlobProperty
|
db.Blob
|
Nenhum |
DateProperty
TimeProperty
DateTimeProperty
|
datetime.date
datetime.time
datetime.datetime
|
Cronológico |
GeoPtProperty
|
db.GeoPt
|
Por latitude, depois longitude |
PostalAddressProperty
|
db.PostalAddress
|
Unicode |
PhoneNumberProperty
|
db.PhoneNumber
|
Unicode |
EmailProperty
|
db.Email
|
Unicode |
UserProperty
|
users.User
|
Endereço de email por ordem Unicode. Tenha em atenção que deve evitar usar UserProperty, de acordo com a nota em
Descrição da classe UserProperty. |
IMProperty
|
db.IM
|
Unicode |
LinkProperty
|
db.Link
|
Unicode |
CategoryProperty
|
db.Category
|
Unicode |
RatingProperty
|
db.Rating
|
Numérico |
ReferenceProperty
SelfReferenceProperty
|
db.Key
|
Por elementos de caminho
(tipo, identificador, tipo, identificador...) |
blobstore.BlobReferenceProperty
|
blobstore.BlobInfo
|
Ordem dos bytes |
ListProperty
StringListProperty
|
list
de um tipo suportado |
Se for ascendente, pelo elemento mais pequeno;
se for descendente, pelo elemento mais elevado |
Tipos de valores do armazenamento de dados
Os valores das propriedades das entidades da base de dados podem ser de um dos seguintes tipos. Consulte acima uma lista das classes correspondentes a usar com as definições.PropertyModel
Além dos tipos padrão do Python e
users.User,
todas as classes descritas nesta secção são fornecidas pelo módulo google.appengine.ext.db.
strouunicode-
Uma string curta (1500 bytes ou menos).
Um valor
stré considerado texto codificado com o codecasciie é convertido num valorunicodeantes de ser armazenado. O valor é devolvido pelo arquivo de dados como um valorunicode. Para strings curtas que usam outros codecs, use um valorunicode.As strings curtas são indexadas pelo arquivo de dados e podem ser usadas em filtros e ordens de ordenação. Para strings de texto com mais de 1500 bytes (que não são indexadas), use uma instância de
Text. Para strings de bytes não codificadas com mais de 1500 bytes (também não indexadas), use uma instância deBlob. Para strings de bytes não textuais não codificadas até 1500 bytes (não carateres) que devem ser indexadas, use uma instância deByteString.Propriedade do modelo:
StringProperty bool-
Um valor booleano (
TrueouFalse).Propriedade do modelo:
BooleanProperty intoulong-
Um valor inteiro, até 64 bits.
Os valores Python
intsão convertidos em valores Pythonlongantes do armazenamento. Um valor armazenado comointé devolvido comolong.Se for atribuído um
longsuperior a 64 bits, apenas são armazenados os 64 bits menos significativos.Propriedade do modelo:
IntegerProperty float-
Um número de vírgula flutuante.
Propriedade do modelo:
FloatProperty datetime.datetime-
Uma data e uma hora. Consulte a
datetimedocumentação do módulo.Se o valor
datetimetiver um atributotzinfo, é convertido no fuso horário UTC para armazenamento. Os valores são devolvidos do arquivo de dados como UTC, com umtzinfodeNone. Uma aplicação que precise de valores de data e hora numa fuso horário específico tem de definirtzinfocorretamente quando atualiza o valor e converter os valores para o fuso horário quando acede ao valor.Algumas bibliotecas usam a variável de ambiente
TZpara controlar o fuso horário aplicado aos valores de data/hora. O App Engine define esta variável de ambiente como"UTC". Tenha em atenção que a alteração desta variável numa aplicação não altera o comportamento de algumas funções de data/hora, porque as alterações às variáveis de ambiente não são visíveis fora do código Python.Se apenas converter valores para e de um fuso horário específico, pode implementar um
datetime.tzinfopersonalizado para converter valores do arquivo de dados:import datetime import time class Pacific_tzinfo(datetime.tzinfo): """Implementation of the Pacific timezone.""" def utcoffset(self, dt): return datetime.timedelta(hours=-8) + self.dst(dt) def _FirstSunday(self, dt): """First Sunday on or after dt.""" return dt + datetime.timedelta(days=(6-dt.weekday())) def dst(self, dt): # 2 am on the second Sunday in March dst_start = self._FirstSunday(datetime.datetime(dt.year, 3, 8, 2)) # 1 am on the first Sunday in November dst_end = self._FirstSunday(datetime.datetime(dt.year, 11, 1, 1)) if dst_start <= dt.replace(tzinfo=None) < dst_end: return datetime.timedelta(hours=1) else: return datetime.timedelta(hours=0) def tzname(self, dt): if self.dst(dt) == datetime.timedelta(hours=0): return "PST" else: return "PDT" pacific_time = datetime.datetime.fromtimestamp(time.mktime(utc_time.timetuple()), Pacific_tzinfo())
Consulte a documentação do módulo
datetime(incluindodatetime.tzinfo). Consulte também o módulo de terceirospytz, embora a distribuiçãopytztenha muitos ficheiros.A classe de propriedade do modelo inclui funcionalidades como a capacidade de usar automaticamente a data e a hora em que uma instância do modelo é armazenada.
DateTimePropertyEstas são funcionalidades do modelo e não estão disponíveis no valor da base de dados não processados (como numa propriedade dinâmica).ExpandoPropriedades do modelo:
DateTimeProperty,DateProperty,TimeProperty list-
Uma lista de valores, cada um dos quais é de um dos tipos de dados suportados.
Quando é usado um
listcomo valor de uma propriedade dinâmicaExpando, não pode ser uma lista vazia. Isto deve-se à forma como os valores de lista são armazenados: quando uma propriedade de lista não tem itens, não tem representação no arquivo de dados. Pode usar uma propriedade estática e a classeListPropertypara representar um valor de lista vazio para uma propriedade.Propriedade do modelo:
ListProperty -
db.Key -
A chave de outra entidade do arquivo de dados.
Nota: as strings de chaves estão limitadas a 1500 bytes ou menos.
m = Employee(name="Susan", key_name="susan5") m.put() e = Employee(name="Bob", manager=m.key()) e.put() m_key = db.Key.from_path("Employee", "susan5") e = Employee(name="Jennifer", manager=m_key)
Propriedades do modelo:
ReferenceProperty,SelfReferenceProperty -
blobstore.BlobKey -
A chave de um valor do Blobstore, gerada pelo Blobstore quando o valor é carregado.
Propriedades do modelo:
blobstore.BlobReferenceProperty -
users.User -
Um utilizador com uma Conta Google.
Um valor
user.Userno arquivo de dados não é atualizado se o utilizador alterar o respetivo endereço de email. Por este motivo, recomendamos vivamente que evite armazenar umusers.Usercomo um valorUserProperty, uma vez que inclui o endereço de email juntamente com o ID único. Se um utilizador alterar o endereço de email e, em seguida, comparar ouser.Userantigo armazenado com o novo valor deuser.User, estes não vão corresponder. Em alternativa, use o valoruser.Useruser_id()como identificador exclusivo estável do utilizador.Propriedade do modelo:
UserProperty - class Blob(arg=None)
-
Dados binários, como uma sequência de bytes. Esta é uma subclasse do tipo
strintegrado.As propriedades Blob não são indexadas e não podem ser usadas em filtros nem ordens de ordenação.
O Blob destina-se a dados binários, como imagens. Aceita um valor
str, mas este valor é armazenado como uma string de bytes e não é codificado como texto. Use uma instância deTextpara grandes quantidades de dados de texto.Propriedade do modelo:
BlobPropertyclass MyModel(db.Model): blob = db.BlobProperty() m = MyModel() m.blob = db.Blob(open("image.png", "rb").read())
Em XML, os BLOBs são codificados em base64, quer contenham ou não dados binários.
- class ByteString(arg)
-
Um valor de blob curto (uma "string de bytes") de 1500 bytes ou menos. ByteString é uma subclasse de
str, e usa um valorstrnão codificado como argumento para o respetivo construtor.As ByteStrings são indexadas pela base de dados e podem ser usadas em filtros e ordens de ordenação. Para strings de bytes com mais de 1500 bytes (que não são indexadas), use uma instância de
Blob. Para dados de texto codificados, usestr(curto, indexado) ouText(longo, não indexado).Propriedade do modelo:
ByteStringProperty - class Text(arg=None, encoding=None)
-
Uma string longa. Esta é uma subclasse do tipo
unicodeintegrado.arg um valor
unicodeoustr. Se arg for umstr, é analisado com a codificação especificada por encoding ouasciise não for especificada nenhuma codificação. Consulte a lista de codificações padrão para ver os valores possíveis de codificação.Ao contrário de uma propriedade de entidade cujo valor é um simples
strouunicode, uma propriedade de texto pode ter mais de 1500 bytes. No entanto, as propriedades de texto não são indexadas e não podem ser usadas em filtros nem ordens de ordenação.Propriedade do modelo:
TextPropertyclass MyModel(db.Model): text = db.TextProperty() m = MyModel() m.text = db.Text(u"kittens") m.text = db.Text("kittens", encoding="latin-1")
- class Category(tag)
-
Uma categoria ou uma "etiqueta". Esta é uma subclasse do tipo
unicodeintegrado.Propriedade do modelo:
CategoryPropertyclass MyModel(db.Model): category = db.CategoryProperty() m = MyModel() m.category = db.Category("kittens")
Em XML, este é um elemento Atom
Category. - class Email(email)
-
Um endereço de email. Esta é uma subclasse do tipo
unicodeintegrado.Nem a classe de propriedade nem a classe de valor validam os endereços de email. Apenas armazenam o valor.
Propriedade do modelo:
EmailPropertyclass MyModel(db.Model): email_address = db.EmailProperty() m = MyModel() m.email_address = db.Email("larry@example.com")
Em XML, trata-se de um elemento
gd:email. - class GeoPt(lat, lon=None)
-
Um ponto geográfico representado por coordenadas de latitude e longitude de vírgula flutuante.
Propriedade do modelo:
GeoPtPropertyEm XML, trata-se de um elemento
georss:point. - class IM(protocol, address=None)
-
Um identificador de mensagens instantâneas.
protocol é o URL canónico do serviço de mensagens instantâneas. Alguns valores possíveis:
Protocolo Descrição sip SIP/SIMPLE xmpp XMPP/Jabber http://aim.com/ AIM http://icq.com/ ICQ http://messenger.msn.com/ MSN Messenger http://messenger.yahoo.com/ Yahoo Messenger http://sametime.com/ Lotus Sametime http://gadu-gadu.pl/ Gadu-Gadu desconhecido Desconhecido ou não especificado address é o endereço do identificador.
Propriedade do modelo:
IMPropertyclass MyModel(db.Model): im = db.IMProperty() m = MyModel() m.im = db.IM("http://example.com/", "Larry97")
Em XML, trata-se de um elemento
gd:im. - class Link(link)
-
Um URL totalmente qualificado. Esta é uma subclasse do tipo
unicodeintegrado.Propriedade do modelo:
LinkPropertyclass MyModel(db.Model): link = db.LinkProperty() m = MyModel() m.link = db.Link("http://www.google.com/")
Em XML, este é um elemento Atom
Link. - class PhoneNumber(phone)
-
Um número de telefone legível. Esta é uma subclasse do tipo
unicodeintegrado.Propriedade do modelo:
PhoneNumberPropertyclass MyModel(db.Model): phone = db.PhoneNumberProperty() m = MyModel() m.phone = db.PhoneNumber("1 (206) 555-1212")
Em XML, trata-se de um elemento
gd.phoneNumber. - class PostalAddress(address)
-
Uma morada. Esta é uma subclasse do tipo
unicodeintegrado.Propriedade do modelo:
PostalAddressPropertyclass MyModel(db.Model): address = db.PostalAddressProperty() m = MyModel() m.address = db.PostalAddress("1600 Ampitheater Pkwy., Mountain View, CA")
Em XML, trata-se de um elemento
gd:postalAddress. - class Classificação(classificação)
-
Uma classificação fornecida pelo utilizador para um conteúdo, como um número inteiro entre 0 e 100. Esta é uma subclasse do tipo
longintegrado. A classe valida se o valor é um número inteiro entre 0 e 100 e gera um erroBadValueErrorse o valor for inválido.Propriedade do modelo:
RatingPropertyclass MyModel(db.Model): rating = db.RatingProperty() m = MyModel() m.rating = db.Rating(97)
Em XML, trata-se de um elemento
gd:rating.
Classes de propriedades
Todas as classes de propriedades do modelo fornecidas por google.appengine.ext.db são subclasses da classe base
Property,
e suportam todos os argumentos do construtor base. Consulte a documentação da classe base para ver informações sobre esses argumentos.
O pacote google.appengine.ext.db fornece as seguintes classes de propriedades do modelo:
- class BlobProperty(...)
-
Uma coleção não interpretada de dados binários.
Os dados de blob são uma string de bytes. Para dados de texto, que podem envolver codificação, use
TextProperty.Tipo de valor:
Blob - class BooleanProperty(...)
-
Um valor booleano (
TrueouFalse).Tipo de valor:
bool - class ByteStringProperty(verbose_name=None, ...)
-
Um valor de blob curto (uma "string de bytes") de 1500 bytes ou menos.
Os valores
ByteStringPropertysão indexados e podem ser usados em filtros e ordens de ordenação.Semelhante a
StringProperty, exceto que o valor não é codificado de forma alguma. Os bytes são armazenados literalmente.Se o elemento
ByteStringPropertyfor obrigatório, o valor não pode ser uma string vazia.Tipo de valor:
ByteString - class CategoryProperty(...)
-
Uma categoria ou "etiqueta", uma palavra ou uma expressão descritiva.
Tipo de valor:
Category - class DateProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Uma data sem uma hora do dia; consulte
DateTimePropertypara mais informações.Tipo de valor:
datetime.date; convertido internamente paradatetime.datetime - class DateTimeProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Uma data e uma hora.
Se auto_now for
True, o valor da propriedade é definido para a hora atual sempre que a instância do modelo é armazenada no arquivo de dados, substituindo o valor anterior da propriedade. Isto é útil para acompanhar a data e a hora da "última modificação" de uma instância do modelo.Se auto_now_add for
True, o valor da propriedade é definido para a hora atual da primeira vez que a instância do modelo é armazenada no arquivo de dados, a menos que já tenha sido atribuído um valor à propriedade. Isto é útil para armazenar a data e a hora de "criação" de uma instância do modelo.Os valores de data/hora são armazenados e devolvidos através do fuso horário UTC. Consulte
datetime.datetimepara ver uma discussão sobre como gerir fusos horários.Tipo de valor:
datetime.datetime - class EmailProperty(...)
-
Um endereço de email.
Nem a classe de propriedade nem a classe de valor validam os endereços de email. Apenas armazenam o valor.
Tipo de valor:
Email - class FloatProperty(...)
-
Um número de vírgula flutuante.
Tipo de valor:
float - class GeoPtProperty(...)
-
Um ponto geográfico representado por coordenadas de latitude e longitude de vírgula flutuante.
Tipo de valor:
GeoPt - class IMProperty(...)
-
Um identificador de mensagens instantâneas.
Tipo de valor:
IM - class IntegerProperty(...)
-
Um valor inteiro, até 64 bits.
Os valores Python
intsão convertidos em valores Pythonlongantes do armazenamento. Um valor armazenado comointé devolvido comolong.Se for atribuído um
longsuperior a 64 bits, apenas são armazenados os 64 bits menos significativos. - class LinkProperty(...)
-
Um URL totalmente qualificado.
Tipo de valor:
Link - class ListProperty(item_type, verbose_name=None, default=None, ...)
-
Uma lista de valores do tipo especificado por item_type.
Numa consulta, a comparação de uma propriedade de lista com um valor executa o teste em relação aos membros da lista:
list_property=valuetesta se o valor aparece em qualquer parte da lista,list_property<valuetesta se algum dos membros da lista é inferior ao valor indicado e assim sucessivamente.Uma consulta não pode comparar dois valores de lista. Não existe forma de testar a igualdade de duas listas sem testar a associação de cada elemento separadamente.
item_type é o tipo dos itens na lista, como um tipo ou uma classe Python. Todos os itens no valor da lista têm de ser do tipo indicado. item_type tem de ser um dos tipos de valores da base de dados, e não pode ser
list.O valor de um
ListPropertynão pode serNone. No entanto, pode ser uma lista vazia. QuandoNoneé especificado para o argumento predefinição (ou quando o argumento predefinição não é especificado), o valor predefinido da propriedade é a lista vazia.Dica: uma vez que os tipos de agregação
ListPropertynão usam as classesProperty, as funcionalidades de classeProperty, como valores automáticos e validação, não são aplicadas automaticamente aos membros do valor da lista. Se quiser validar um valor de membro através de uma classeProperty, pode instanciar a classe e chamar o respetivo métodovalidate()no valor.default é o valor predefinido para a propriedade de lista. Se
None, a predefinição é uma lista vazia. Uma propriedade de lista pode definir um validador personalizado para não permitir a lista vazia.Consulte a página Modelagem de dados para mais informações sobre as propriedades e os valores das listas.
Tipo de valor: um Python
listde valores do tipo especificado - class PhoneNumberProperty(...)
-
Um número de telefone legível.
Tipo de valor:
PhoneNumber - class PostalAddressProperty(...)
-
Uma morada.
Tipo de valor:
PostalAddress - class RatingProperty()
-
Uma classificação fornecida pelo utilizador para um conteúdo, como um número inteiro entre 0 e 100.
Tipo de valor:
Rating - class ReferenceProperty(reference_class=None, verbose_name=None, collection_name=None, ...)
-
Uma referência a outra instância do modelo. Por exemplo, uma referência pode indicar uma relação muitos-para-um entre o modelo com a propriedade e o modelo referenciado pela propriedade.
reference_class é a classe do modelo da instância do modelo que está a ser referenciada. Se for especificado, apenas as instâncias do modelo da classe podem ser atribuídas a esta propriedade. Se
None, qualquer instância do modelo pode ser o valor desta propriedade.collection_name é o nome da propriedade a atribuir à classe do modelo referenciada. O valor da propriedade é um
Querypara todas as entidades que fazem referência à entidade. Se não for definido nenhum collection_name, é usadomodelname_set(com o nome do modelo referenciado em letras minúsculas e_setadicionado).Nota: collection_name tem de ser definido se existirem várias propriedades no mesmo modelo que referenciem a mesma classe de modelo. Caso contrário, é apresentado um
DuplicatePropertyErrorquando os nomes predefinidos são gerados.ReferencePropertyfaz automaticamente referência e desreferência a instâncias de modelos como valores de propriedades: uma instância de modelo pode ser atribuída diretamente a uma propriedade de referência e a respetiva chave é usada. O valorReferencePropertypode ser usado como se fosse uma instância de modelo, e a entidade de armazenamento de dados é obtida e a instância de modelo criada quando é usada pela primeira vez desta forma. As propriedades de referência intocadas não consultam dados desnecessários.class Author(db.Model): name = db.StringProperty() class Story(db.Model): author = db.ReferenceProperty(Author) story = db.get(story_key) author_name = story.author.name author = db.get(author_key) stories_by_author = author.story_set.get()
Tal como acontece com um valor
Key, é possível que um valor de propriedade de referência se refira a uma entidade de dados que não existe. Se uma entidade referenciada for eliminada do arquivo de dados, as referências à entidade não são atualizadas. O acesso a uma entidade que não existe gera um erroReferencePropertyResolveError.A eliminação de uma entidade não elimina as entidades referidas por uma propriedade de referência.
Tipo de valor:
db.Key - class SelfReferenceProperty(verbose_name=None, collection_name=None, ...)
-
Uma referência a outra instância do modelo da mesma classe (consulte
ReferenceProperty).Tipo de valor:
db.Key - class StringListProperty(verbose_name=None, default=None, ...)
-
Semelhante a uma propriedade de lista de valores
strouunicode(basestring) do Python. - class StringProperty(verbose_name=None, multiline=False, ...)
-
Uma string curta. Aceita um valor
strouunicode(basestring) do Python de 1500 bytes ou menos.Os valores
StringPropertysão indexados e podem ser usados em filtros e ordens de ordenação.Se multiline for
False, o valor não pode incluir carateres de mudança de linha. A bibliotecadjangoformsusa isto para aplicar uma diferença entre campos de texto e campos de área de texto no modelo de dados, e outros podem usá-lo para um objetivo semelhante.Se a propriedade de string for obrigatória, o respetivo valor não pode ser uma string vazia.
- class TextProperty()
-
Uma string longa.
Ao contrário de
StringProperty, um valorTextPropertypode ter mais de 1500 bytes. No entanto, os valores deTextPropertynão são indexados e não podem ser usados em filtros nem ordens de ordenação.Os valores
TextPropertyarmazenam texto com uma codificação de texto. Para dados binários, useBlobProperty.Se a propriedade de texto for obrigatória, o respetivo valor não pode ser uma string vazia.
Tipo de valor:
Text - class TimeProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Uma hora do dia sem uma data. Aceita um valor da biblioteca padrão do Python; consulte
DateTimePropertypara mais informações.datetime.timeTipo de valor:
datetime.time; convertido internamente paradatetime.datetime - class UserProperty(verbose_name=None, auto_current_user=False, auto_current_user_add=False, ...)
-
Importante: recomendamos vivamente que não armazene um
UserProperty, uma vez que inclui o endereço de email e o ID exclusivo do utilizador. Se um utilizador alterar o respetivo endereço de email e comparar o valorUserantigo armazenado com o novo valorUser, não vai haver correspondência.Um utilizador com uma Conta Google.
Se auto_current_user for
True, o valor da propriedade é definido para o utilizador com sessão iniciada atualmente sempre que a instância do modelo é armazenada no arquivo de dados, substituindo o valor anterior da propriedade. Isto é útil para acompanhar que utilizador modifica uma instância do modelo.Se auto_current_user_add for
True, o valor da propriedade é definido para o utilizador com sessão iniciada atualmente na primeira vez que a instância do modelo é armazenada no repositório de dados, a menos que a propriedade já tenha sido atribuída a um valor. Isto é útil para acompanhar que utilizador cria uma instância do modelo, que pode não ser o mesmo utilizador que a modifica posteriormente.UserProperty não aceita um valor predefinido. Os valores predefinidos são definidos quando a classe do modelo é importada pela primeira vez e, com a colocação em cache da importação, podem não corresponder ao utilizador com sessão iniciada atualmente.
Tipo de valor:
users.User