Blog
All Blog Posts | Next Post | Previous PostCurso Rápido TMS Aurelius - Primeiros Passos
Tuesday, February 26, 2013
Apesar do TMS Aurelius fornecer uma extensa documentação, às vezes recebemos pedidos para fornecer ainda mais exemplos, explicações, códigos-fonte sobre como realizar determinadas tarefas. E também, é claro, exemplos em português. Assim, iniciaremos aqui uma série de posts sobre como usar o TMS Aurelius. Tudo já está de alguma forma coberto pela documentação, mas aqui no blog tentaremos oferecer não informações muito técnicas, "oficiais", mas simplesmente explicar para que ele serve e fornecer exemplos de uso reais. Em resumo, uma forma alternativa de mostrar como usá-lo.Começando pelo princípio, mostraremos uma pequena aplicação, mínima, usando o TMS Aurelius. Suponho que tenhamos uma classe de entidade TCustomer (cliente), mapeada da forma a seguir:
unit Customer; interface uses Aurelius.Mapping.Attributes; type [Entity, Automapping] TCustomer = class private FId: integer; FName: string; public property Id: integer read FId write FId; property Name: string read FName write FName; end; implementation end.
program GettingStarted; {$APPTYPE CONSOLE} uses Aurelius.Drivers.Interfaces, Aurelius.Drivers.SQLite, Aurelius.Engine.DatabaseManager, Aurelius.Engine.ObjectManager, Aurelius.SQL.SQLite, Customer; var Connection: IDBConnection; Manager: TObjectManager; Customer: TCustomer; begin Connection := TSQLiteNativeConnectionAdapter.Create('test.db'); Manager := TObjectManager.Create(Connection); Customer := TCustomer.Create; Customer.Name := 'First customer'; Manager.Save(Customer); Manager.Free; WriteLn('Customer saved.'); ReadLn; end.
1. A classe que será persistida. Nesse exemplo, a classe TCustomer.
2. Um mapeamento entre a classe e o banco de dados. Isso é obtido usando-se os atributos [Entity] e [Automapping]. Neste caso as propriedades são mapeadas automaticamente aos campos da tabela, mas você pode definir um mapeamento customizado se assim desejar. Chamaremos de "entidades" as instâncias dos objetos gerenciados pelo Aurelius.
3. Uma conexão ao banco de dados. No exemplo, é a variável Connection, que implementa a interface IDBConnection. Aqui nós estamos conectando a um banco SQLite local e precisamos usar o adapter TSQLiteNativeConnectionAdapter. Ou seja, sempre precisaremos de um adapter que faz a ponte entre o "mundo " do banco de dados relacionado e o "mundo" dos objetos. No Windows você deve se certificar que a dll sqlite3.dll está em um diretório que o Windows possa encontrá-la. No Mac OS X e no iOS, o SQLite já está disponível pelo sistema operacional.
4. Um object manager (gerenciador de objetos) para salvar e gerenciar suas entidads. A segunda linha do fonte cria um object manager, que salva os objetos no banco de dados especificado pela interface IDBConnection.
Ao final, o código simplesmente instancia um objeto TCustomer, preenche suas propriedades e o salva no banco de dados. Esta é a sua primeira aplicação com o TMS Aurelius!
Uma informação adicional: se o arquivo "test.db" não existir (nosso banco de dados), o Aurelius irá criar um banco vazio pra você (no caso to SQLite adapter apenas). Mas a estrutura das tabelas ainda não existe. Você pode explicitamente pedir ao Aurelius para criar a estrutura pra você (tabelas, campos, relacionamentos, etc.), usando o seguinte código:
procedure CreateDatabase(Connection: IDBConnection); var DBManager: TDatabaseManager; begin DBManager := TDatabaseManager.Create(Connection); DBManager.BuildDatabase; DBManager.Free; end;
Wagner Landgraf
This blog post has received 4 comments.
2. Monday, July 1, 2013 at 7:42:45 AM
Você pode criar um índice único, sim, usando o atributo [Unique]. O recurso para criar índices quaisquer, mesmo não único, apenas para performance, ainda não existe, mas será implementado, está no roadmap.
Wagner Landgraf
3. Friday, August 16, 2013 at 11:14:11 PM
Caro Wagner boa noite!
Estou estudando o Aurelius com a versão do Delphi XE4, baixei um exemplo da clube delphi edição 151 e estou tendo problemas quando trabalho com TObjectList da System.Generics.Collections.
Esse exemplo traz uma classe produto e estou o trecho de código abaixo para obter todos produtos cadastrados.
procedure TForm1.Button1Click(Sender: TObject);
var
s: ISession;
p: TObjectList<TProduto>;
begin
s := TService.GetSession;
p := s.ObjectManager.FindAll<TProduto>;
AureliusDataset1.SetSourceList(p);
AureliusDataset1.open;
end;
Quando clico no botão o aurelius faz a pesquisa e chega a trazer os dados mas, ao utilizar o aureliusdataset com um datasource e uma grid estou recebendo uma serie de AV''s.
Estou montando um projeto onde varei um servidor datasnap com o aurelius e firedac, estou tendo dificuldades para encontrar exemplos dessa arquitetura além de informações sobre performace e segurança e número de usuários simultâneos.
Pretendo comprar uma licença "site" do aurelius mas, essa questões estão travando o negócio. Um ponto muito importante para nós é o TMS Data Modeler que atualmente não é compatível com PostGreSQL.
Enviei um e-mail para o grupo NDDV do yahoo com o seguinte titulo "Arquitetura de servidor com REST/JSON/ORM" e um dos colegas contribuiu com os seguintes dizeres
"Aurelius da problemas com o Datasnap justamente pelo fato dos metodos ser Stateless" isso procede?
Aguardo o seu retorno e conto com a sua colaboração.
Estou estudando o Aurelius com a versão do Delphi XE4, baixei um exemplo da clube delphi edição 151 e estou tendo problemas quando trabalho com TObjectList da System.Generics.Collections.
Esse exemplo traz uma classe produto e estou o trecho de código abaixo para obter todos produtos cadastrados.
procedure TForm1.Button1Click(Sender: TObject);
var
s: ISession;
p: TObjectList<TProduto>;
begin
s := TService.GetSession;
p := s.ObjectManager.FindAll<TProduto>;
AureliusDataset1.SetSourceList(p);
AureliusDataset1.open;
end;
Quando clico no botão o aurelius faz a pesquisa e chega a trazer os dados mas, ao utilizar o aureliusdataset com um datasource e uma grid estou recebendo uma serie de AV''s.
Estou montando um projeto onde varei um servidor datasnap com o aurelius e firedac, estou tendo dificuldades para encontrar exemplos dessa arquitetura além de informações sobre performace e segurança e número de usuários simultâneos.
Pretendo comprar uma licença "site" do aurelius mas, essa questões estão travando o negócio. Um ponto muito importante para nós é o TMS Data Modeler que atualmente não é compatível com PostGreSQL.
Enviei um e-mail para o grupo NDDV do yahoo com o seguinte titulo "Arquitetura de servidor com REST/JSON/ORM" e um dos colegas contribuiu com os seguintes dizeres
"Aurelius da problemas com o Datasnap justamente pelo fato dos metodos ser Stateless" isso procede?
Aguardo o seu retorno e conto com a sua colaboração.
André Geraldo dos Santos
4. Sunday, August 18, 2013 at 3:20:20 PM
André,
sugiro que mande um e-mail diretamente pra mim (pode enviar pela aba "Suporte" do site da TMS que rapidamente chega pra mim e eu te respondo) para tratarmos de detalhes técnicos, já que com as informações acima ainda não consigo te identificar a fonte do problema. Só pra adiantar, o teu GetSession traz uma interface já criada ou cria na hora? Porque lembre-se que se você destruir o object manager os objetos serão destruídos e claro que o AureliusDataset estará manipulando objetos destruídos. Ou deixe o seu ObjectManager criado ou ajuste a propriedade OwnsObjects pra false para que ele não destrua os objetos obtidos do servidor.
Sobre a questão do stateless, eu respondi no próprio grupo, podemos continuar também a discussão por lá.
sugiro que mande um e-mail diretamente pra mim (pode enviar pela aba "Suporte" do site da TMS que rapidamente chega pra mim e eu te respondo) para tratarmos de detalhes técnicos, já que com as informações acima ainda não consigo te identificar a fonte do problema. Só pra adiantar, o teu GetSession traz uma interface já criada ou cria na hora? Porque lembre-se que se você destruir o object manager os objetos serão destruídos e claro que o AureliusDataset estará manipulando objetos destruídos. Ou deixe o seu ObjectManager criado ou ajuste a propriedade OwnsObjects pra false para que ele não destrua os objetos obtidos do servidor.
Sobre a questão do stateless, eu respondi no próprio grupo, podemos continuar também a discussão por lá.
Wagner Landgraf
All Blog Posts | Next Post | Previous Post
INDICE_CUSTOMER_NOME para o campo nome.
Pergunto isso por que tenho um projeto em que preciso criar uma estrutura de tabelas independente do banco de dados, só que se não criar indices para determinados campos a busca vai ficar muito lenta.
Rodolfo