sexta-feira, 4 de março de 2011

Upload e Download de dados no Google App Engine - GAE

Olá para todos,

 Dando continuidade aos meus estudos de Python (Webapp-CE), visando um melhor uso do GAE, estudei uma funcionalidade muito bacana nessa semana: o Bulk Loader, que pelo tradutor do Google significa Carregador de Alto Volume.

 Ele serve para fazer upload de dados para o Banco de Dados (BD) no GAE e para fazer download de dados do mesmo. Então algumas tarefas interessantes podem ser feitas com ele:

  •  Backup de dados
  • Carregamento de cargas estáticas no servidor
  • Update de dados no servidor
  • Migrar dados de uma app para outra
Os dados podem ser baixados e carregados em dois formatos básicas: CSV e XML.

 Depois dessa introdução vou mostrar um exemplo na prática.

 Digamos que queremos fazer uma aplicação estados brasileiros. Vamos aos passos:

 1) Criar o modelo para a entidade de Estado (State) :


class State(db.Model):
    name = db.StringProperty(required = True)
    acronym = db.StringProperty(required = True)
    country = db.ReferenceProperty(reference_class = Country, required = True)


2) Configurar o arquvo bulkloader.yaml:

Esse arquivo configura as maneira como será feito o upload/dowload. Na documentação existe uma maneira de criar o formato básico do arquivo, mas já que vc está lendo esse post, pode copiar daqui mesmo = ). A parte inicial do arquivo contém os imports necessários para as transferências. Na documentação é ensinado como organizar imports de módulos de terceiros, caso vc deseja fazer algo mais rebuscado. Mas na maioria dos casos, o início não será alterado.

 Observe a parte final do arquivo, a partir do item "-transformers". Nessa seção que a configuração dos dados referentes ao State é feita. Primeiramente se indica o tipo do dado (kind=State). Em seguida, é configurado o tipo de arquivo (connector=csv). Portanto escolhi o formato de valores separados por vírgula, mas poderia ser XML, bastando colocar o valor simplexml.

 Depois são configuradas as propriedades do modelo. No caso, configurei 3 propriedades: a chave (key), o nome (name) e a referência para um país (country). Cada propriedade possui algumas opções de configurações.

 O item property contém o nome da propriedade em seu modelo.

 O item external_name indica o nome da propriedade no CSV. Esses nomes constarão como cabeçalhos na primeira linha do CSV

 O item external_transform indica uma transformaçao que deve ser feita no dado quando for feito o download. No caso, utilizei apenas o transform.key_id_or_name_as_string que transforma a chave (key) do modelo em String.

 O item internal_transform indica uma transformação que deve ser feita no dado quando for feito o upload. No exemplo, utilizei apenas o transform.create_foreign_key('Country',True) que serve para que seja criada uma referência para o tipo País (Country) e que se use o valor número para a chave (parâmetro com valor True.


python_preamble:
- import: base64
- import: re
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.bulkload.bulkloader_wizard
- import: google.appengine.ext.db
- import: google.appengine.api.datastore
- import: google.appengine.api.users

transformers:
- kind: State
  connector: csv
  connector_options:
    # TODO: Add connector options here--these are specific to each connector.
  property_map:
    - property: __key__
      external_name: key
      export_transform: transform.key_id_or_name_as_string
   
    - property: name
      external_name: name
     
    - property: country
      external_name: country
      export_transform: transform.key_id_or_name_as_string
      import_transform: transform.create_foreign_key('Country',True)



3) Montando dados a serem carregados:

 Para nosso exemplo, digamos que vc já tenha salvado o País Brasil em seu BD no GAE e que ele possua um id=1. Então construi um CSV (state.csv) com alguns estados brasileiros:


country,name
1,Acre
1,Piauí
1,Santa Catarina


4) Carregando os dados:

 Importante: o Big Table, BD do GAE, não possui esquema. Por essa razão, ele só conhece o "esquema" de seus modelos após vc ter salvado ao menos um item nele. Portanto, antes de carregar dados, certifique-se de salvar um dado do tipo desejado antes de tentar fazer o upload de dados.

Acresente em seu app.yaml a seguinte configuração:


builtins:
- remote_api: on

 Faça o deploy da app. Feito isso, execute o comando, onde "sua-app": é o id da sua aplicação:

appcfg.py upload_data --config_file=bulkloader.yaml --filename=state.csv --kind=State --url=http://sua-app.appspot.com/_ah/remote_api

Vc verá mensagens dos dados sendo carregados. Após o termino do carregamento, entre no console de administração de sua app para conferir os novos dados em sua aplicação.

5) Dowload dos dados:

 Experiemente salvar novos estados em sua aplicação repetindo os passos anteriores. Depois disso, vamos fazer o dowload de todos esses dados. Execute o comando:


appcfg.py dowload_data --config_file=bulkloader.yaml --filename=state_dump.csv --kind=State --url=http://sua-app.appspot.com/_ah/remote_api

 Esse comando irá baixar seus dados para o arquivo state_dump.csv. No meu caso, eu salvei todos os estados brasileiros em minha app, e o conteúdo baixado foi:

country,name,key
1,Acre,1001
1,Piauí,1002
1,Santa Catarina,1003
1,Alagoas,2001
1,Bahia,2002
1,Amapá,3001
1,Ceará,3002
1,Maranhão,3003
1,Rio de Janeiro,3004
1,São Paulo,3005
1,Amazonas,4001
1,Espírito Santo,4002
1,Rio Grande do Norte,4003
1,Sergipe,4004
1,Distrito Federal,5001
1,Paraíba,5002
1,Pernambuco,5003
1,Roraima,5004
1,Goiás,6001
1,Minas Gerais,6002
1,Rondônia,6003
1,Mato Grosso,7001
1,Rio Grande do Sul,7002
1,Tocantins,7003
1,Mato Grosso do Sul,8001
1,Pará,8002
1,Paraná,8003


Dessa maneira, espero ter conseguido exemplificar como fazer transferências de dados de seu computador para o GAE e vice-versa. Para conferir a documentação completa da funcionalidade, confira na Documentação.

 Deixe um comentário ou crítica se achou esse post util.

 Abs
 Renzo Nuccitelli