0
A magia do mapeamento objeto relacional com
                  SQLAlchemy
                  Python ORM(Mapeamento objeto re...
Roteiro
1            ¸˜
      Introducao
         Sobre o palestrante
         Sobre a palestra
2     Framework SQLAlchemy...
Roteiro
1            ¸˜
      Introducao
         Sobre o palestrante
         Sobre a palestra
2     Framework SQLAlchemy...
Roteiro
1            ¸˜
      Introducao
         Sobre o palestrante
         Sobre a palestra
2     Framework SQLAlchemy...
Roteiro
1            ¸˜
      Introducao
         Sobre o palestrante
         Sobre a palestra
2     Framework SQLAlchemy...
¸˜
                                     Introducao   Sobre o palestrante


Roteiro
1            ¸˜
      Introducao
      ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                  Introducao   Sobre o palestrante


    ´
Historia de programador


                  ...
¸˜
                                     Introducao   Sobre a palestra


Roteiro
1            ¸˜
      Introducao
         ...
¸˜
                                  Introducao   Sobre a palestra


Conceitos




              ¸˜
      Programacao
    ...
¸˜
                                  Introducao   Sobre a palestra


Conceitos




              ¸˜
      Programacao
    ...
¸˜
                                  Introducao   Sobre a palestra


Conceitos




              ¸˜
      Programacao
    ...
¸˜
                                  Introducao   Sobre a palestra


Conceitos




              ¸˜
      Programacao
    ...
Framework SQLAlchemy    Conteudo
                                                                 ´


Roteiro
1           ...
Framework SQLAlchemy    Conteudo
                                                              ´


A linguagem Python
    ...
Framework SQLAlchemy    Conteudo
                                                              ´


A linguagem Python
    ...
Framework SQLAlchemy    Conteudo
                                                              ´


A linguagem Python
    ...
Framework SQLAlchemy    Conteudo
                                                              ´


A linguagem Python
    ...
Framework SQLAlchemy    Conteudo
                                                              ´


A linguagem Python
    ...
Framework SQLAlchemy    Conteudo
                                                              ´


Bancos de dados relacio...
Framework SQLAlchemy    Conteudo
                                                              ´


Bancos de dados relacio...
Framework SQLAlchemy    Conteudo
                                                              ´


Bancos de dados relacio...
Framework SQLAlchemy    Conteudo
                                                              ´


Bancos de dados relacio...
Framework SQLAlchemy    Conteudo
                                                              ´


Bancos de dados relacio...
Framework SQLAlchemy    Conteudo
                                                              ´


       ¸˜
Orientacao a ...
Framework SQLAlchemy    Conteudo
                                                              ´


       ¸˜
Orientacao a ...
Framework SQLAlchemy    Conteudo
                                                              ´


       ¸˜
Orientacao a ...
Framework SQLAlchemy    Conteudo
                                                              ´


       ¸˜
Orientacao a ...
Framework SQLAlchemy    Conteudo
                                                              ´


Frameworks



      Arc...
Framework SQLAlchemy    Conteudo
                                                              ´


Frameworks



      Arc...
Framework SQLAlchemy    Conteudo
                                                              ´


Frameworks



      Arc...
˜
                                    Mao na massa   Os ingredientes


Roteiro
1            ¸˜
      Introducao
         S...
˜
                                 Mao na massa   Os ingredientes


       ¸˜
Instalacao



      Assim como a maioria dos...
˜
                                 Mao na massa   Os ingredientes


       ¸˜
Instalacao



      Assim como a maioria dos...
˜
                                 Mao na massa   Os ingredientes


       ¸˜
Instalacao



      Assim como a maioria dos...
˜
                                    Mao na massa          ¸˜
                                                   Preparac...
˜
                                  Mao na massa           ¸˜
                                                  Preparacao...
˜
                                    Mao na massa           ¸˜
                                                    Prepar...
˜
                                    Mao na massa           ¸˜
                                                    Prepar...
˜
                                  Mao na massa             ¸˜
                                                    Prepar...
˜
                                  Mao na massa           ¸˜
                                                  Preparacao...
˜
                                  Mao na massa           ¸˜
                                                  Preparacao...
˜
                                    Mao na massa          ¸˜
                                                   Utilizac...
˜
                                  Mao na massa           ¸˜
                                                  Utilizacao...
˜
                                    Mao na massa           ¸˜
                                                    Utiliz...
˜
                                  Mao na massa           ¸˜
                                                  Utilizacao...
˜
                                  Mao na massa           ¸˜
                                                  Utilizacao...
˜
                                  Mao na massa             ¸˜
                                                    Utiliz...
˜
                                  Mao na massa           ¸˜
                                                  Utilizacao...
˜
                                    Mao na massa   Consultando


Roteiro
1            ¸˜
      Introducao
         Sobre...
˜
                                  Mao na massa    Consultando


Obtendo objetos




Iterando por objetos
               ...
˜
                                  Mao na massa     Consultando


Obtendo tuplas




Iterando por tuplas
                ...
˜
                                  Mao na massa    Consultando


Obtendo tuplas com objetos




Tuplas com objetos e valo...
˜
                                  Mao na massa    Consultando


                          ¸˜
Aplicando limites e paginac...
˜
                                  Mao na massa    Consultando


Filtrando




Com filtros usando argumentos com palavras ...
˜
                                  Mao na massa    Consultando


              ˜
Usando expressoes




                  ...
˜
                                  Mao na massa    Consultando


”Join”encadeando filtros




”filter”retorna objetos query...
˜
                                    Mao na massa   Operadores


Roteiro
1            ¸˜
      Introducao
         Sobre ...
˜
                                  Mao na massa   Operadores


Igualdade




Operador de igualdade
# Operador de igualdad...
˜
                                  Mao na massa   Operadores


Diferenca
       ¸




Operador de diferenca
             ...
˜
                                  Mao na massa    Operadores


Semelhanca
        ¸




Operador de semelhanca
         ...
˜
                                  Mao na massa    Operadores


    ´
Contem




Operador de conteudo
                 ´
...
˜
                                 Mao na massa   Operadores


Nulo




Testar campo nulo
                 ´
# Verificando...
˜
                                  Mao na massa       Operadores


    ´
”E”logico




          ´
Operador logico ”E”
# ...
˜
                                  Mao na massa    Operadores


     ´
”OU”logico




          ´
Operador logico ”OU”
>>...
˜
                                  Mao na massa    Operadores


”Match”




Equivalencia
# Match tem efeitos que dependem...
˜
                                    Mao na massa   Receitas alternativas


Roteiro
1            ¸˜
      Introducao
    ...
˜
                                  Mao na massa    Receitas alternativas


Obtendo uma lista




   ´
O metodo all() reto...
˜
                                  Mao na massa    Receitas alternativas


Primeiro elemento




    ´
O metodo first() ap...
˜
                                     Mao na massa   Receitas alternativas


Otendo linha unica
             ´


    ´   ...
˜
                                  Mao na massa    Receitas alternativas


       ˜
Expressoes SQL




                  ...
˜
                                  Mao na massa    Receitas alternativas


Parametros SQL




Parametros bind
# Parametro...
˜
                                    Mao na massa     Receitas alternativas


Comando SQL




                    ´
SQL c...
˜
                                    Mao na massa   Relacionamento


Roteiro
1            ¸˜
      Introducao
         So...
˜
                                  Mao na massa    Relacionamento


    ¸˜
Relacao declarativa


                   ¸˜
Es...
˜
                                  Mao na massa     Relacionamento


”BackRef”




       ¸˜
Na direcao oposta
          ...
˜
                                  Mao na massa       Relacionamento


Aplicando a estrutura




Criando as estruturas no...
˜
                                  Mao na massa    Relacionamento


Novo objeto relacionado




         ´      ˜
Novos u...
˜
                                 Mao na massa   Relacionamento


Lista de enderecos
               ¸




Podemos adicion...
˜
                                  Mao na massa       Relacionamento


                          ¸˜
Visibilidade nas duas...
˜
                                    Mao na massa   Relacionamento


”Commitando”




                   ¸˜
Salvando as i...
˜
                                  Mao na massa    Relacionamento


Economia de recursos




                       ˜
As ...
˜
                                 Mao na massa   Relacionamento


Agora os enderecos
               ¸




    ¸˜
Selecao ...
˜
                                  Mao na massa    Relacionamento


Economia de acessos



              ´
Se for o caso ...
˜
                                  Mao na massa      Relacionamento


             ¸˜
Juntando relacoes




Inner join, u...
˜
                                  Mao na massa    Relacionamento


Relacionando com join




            ¸˜
Usando a fun...
˜
                                  Mao na massa    Relacionamento


Clausula ”on”




´
E poss´vel indicar a clausula on ...
˜
                                  Mao na massa    Relacionamento


join em query




Aplicando o join() em objetos Query...
˜
                                  Mao na massa    Relacionamento


”Target”




                           ¸˜
Explicitan...
˜
                                 Mao na massa   Relacionamento


     ˆ
Referencias




      Python - http://www.python...
˜
                                 Mao na massa   Relacionamento


     ˆ
Referencias




      Python - http://www.python...
˜
                                 Mao na massa   Relacionamento


     ˆ
Referencias




      Python - http://www.python...
˜
                                 Mao na massa   Relacionamento


     ˆ
Referencias




      Python - http://www.python...
´
                                      Sumario


   ´
Sumario




             ¸˜
      Introducao
             Sobre o p...
´
                                      Sumario


   ´
Sumario




             ¸˜
      Introducao
             Sobre o p...
´
                                      Sumario


   ´
Sumario




             ¸˜
      Introducao
             Sobre o p...
´
                                      Sumario


   ´
Sumario




             ¸˜
      Introducao
             Sobre o p...
´
                                      Sumario


   ´
Sumario




             ¸˜
      Introducao
             Sobre o p...
Bibliografia


Bibliografia



[1] SetupTools1.
    http://peak.telecommunity.com/DevCenter/setuptools, 3
    September 2008...
Bibliografia


Bibliografia



[1] SetupTools1.
    http://peak.telecommunity.com/DevCenter/setuptools, 3
    September 2008...
Bibliografia


Bibliografia



[1] SetupTools1.
    http://peak.telecommunity.com/DevCenter/setuptools, 3
    September 2008...
Bibliografia


Agradecimentos




                        ¸˜                    ˆ
      ASCAM-PR, Associacao de Servidores ...
Bibliografia


Agradecimentos




                        ¸˜                    ˆ
      ASCAM-PR, Associacao de Servidores ...
Bibliografia


Agradecimentos




                        ¸˜                    ˆ
      ASCAM-PR, Associacao de Servidores ...
Bibliografia


Agradecimentos




                        ¸˜                    ˆ
      ASCAM-PR, Associacao de Servidores ...
Bibliografia


       ˜
Conclusao




        ´                                 ´
Python e uma linguagem muito bacana, faci...
Upcoming SlideShare
Loading in...5
×

SQLAlchemy - A magia do mapeamento objeto relacional.

2,922

Published on

Apresentação da biblioteca de mapeamento objeto relacional escrita em Python, SQLAlchemy. Um framework de mapeamento objeto relacional flexível e muito poderoso, comparado muitas vezes com Hybernate, um framework escrito em Java.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,922
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
97
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "SQLAlchemy - A magia do mapeamento objeto relacional."

  1. 1. A magia do mapeamento objeto relacional com SQLAlchemy Python ORM(Mapeamento objeto relacional) Ramiro Luz2 1 Associacao ¸˜ Python Brasil - APyBR 2 Comunidade ´ de usuarios Python Brasileira ´ Grupo de Usuarios Python do Parana´ ˜ Congresso Internacional de Software Livre, Sao Paulo-SP, 2008 Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 1 / 72
  2. 2. Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72
  3. 3. Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72
  4. 4. Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72
  5. 5. Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72
  6. 6. ¸˜ Introducao Sobre o palestrante Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 3 / 72
  7. 7. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  8. 8. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  9. 9. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  10. 10. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  11. 11. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  12. 12. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  13. 13. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  14. 14. ¸˜ Introducao Sobre o palestrante ´ Historia de programador ´ cp200, fitas magneticas, gravadores e programas em basic. Turbo Pascal e Clipper Summer. A busca, VisualDbase(DBase5), Visual FoxPro, Visual Basic, Java, Delphi, PHP e finalmente a linguagem Python. ´ Proximas tentativas, Haskell, Smalltalk, Common Lisp. Comunidades ´ ´ Grupo de usuarios Debian do Parana, GUD-BR-PR http://www.debian-pr.org/ ´ ´ Grupo de usuarios da linguagem Python do Parana, GruPy-PR http://www.pythonbrasil.com.br/moin.cgi/GrupyPr ¸˜ Membro suplente do Conselho Deliberativo da Associacao Python Brasil, http://associacao.pythonbrasil.org/ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72
  15. 15. ¸˜ Introducao Sobre a palestra Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 5 / 72
  16. 16. ¸˜ Introducao Sobre a palestra Conceitos ¸˜ Programacao Bancos de dados ¸˜ Orientacao a objetos ´ Termos tecnicos usados na palestra. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72
  17. 17. ¸˜ Introducao Sobre a palestra Conceitos ¸˜ Programacao Bancos de dados ¸˜ Orientacao a objetos ´ Termos tecnicos usados na palestra. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72
  18. 18. ¸˜ Introducao Sobre a palestra Conceitos ¸˜ Programacao Bancos de dados ¸˜ Orientacao a objetos ´ Termos tecnicos usados na palestra. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72
  19. 19. ¸˜ Introducao Sobre a palestra Conceitos ¸˜ Programacao Bancos de dados ¸˜ Orientacao a objetos ´ Termos tecnicos usados na palestra. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72
  20. 20. Framework SQLAlchemy Conteudo ´ Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 7 / 72
  21. 21. Framework SQLAlchemy Conteudo ´ A linguagem Python ¸˜ ˆ Linguagem de programacao dinamica e interpretada de facil ´ aprendizado. Usada em uma grande variedade de dom´nios de aplicacoes, ı ¸˜ Web, processamento de email, tratamento de html e xml, acesso ¸˜ ´ a banco de dados, aplicacoes para rede, interfaces graficas, ¸˜ ¸˜ computacao cient´fica, jogos, educacao, entre outras. ı Clareza da sintaxe, Identacao ¸ ˜ obrigatoria, pequena quantidade de ´ ˜ ´ palavras reservadas, as bibliotecas sao muitos faceis de usar. ´ Python possue uma grande variedade de bibliotecas, alem da ˜ biblioteca padrao a linguagem conta com uma enorme variedade de bibliotecas encontradas no ´ndice de pacotes python, ı http://pypi.python.org/pypi Linguagem com uma produtividade muito grande, tarefas ´ completas com poucas linhas, codigo simples, facilidade de ¸˜ manutencao. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72
  22. 22. Framework SQLAlchemy Conteudo ´ A linguagem Python ¸˜ ˆ Linguagem de programacao dinamica e interpretada de facil ´ aprendizado. Usada em uma grande variedade de dom´nios de aplicacoes, ı ¸˜ Web, processamento de email, tratamento de html e xml, acesso ¸˜ ´ a banco de dados, aplicacoes para rede, interfaces graficas, ¸˜ ¸˜ computacao cient´fica, jogos, educacao, entre outras. ı Clareza da sintaxe, Identacao ¸ ˜ obrigatoria, pequena quantidade de ´ ˜ ´ palavras reservadas, as bibliotecas sao muitos faceis de usar. ´ Python possue uma grande variedade de bibliotecas, alem da ˜ biblioteca padrao a linguagem conta com uma enorme variedade de bibliotecas encontradas no ´ndice de pacotes python, ı http://pypi.python.org/pypi Linguagem com uma produtividade muito grande, tarefas ´ completas com poucas linhas, codigo simples, facilidade de ¸˜ manutencao. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72
  23. 23. Framework SQLAlchemy Conteudo ´ A linguagem Python ¸˜ ˆ Linguagem de programacao dinamica e interpretada de facil ´ aprendizado. Usada em uma grande variedade de dom´nios de aplicacoes, ı ¸˜ Web, processamento de email, tratamento de html e xml, acesso ¸˜ ´ a banco de dados, aplicacoes para rede, interfaces graficas, ¸˜ ¸˜ computacao cient´fica, jogos, educacao, entre outras. ı Clareza da sintaxe, Identacao ¸ ˜ obrigatoria, pequena quantidade de ´ ˜ ´ palavras reservadas, as bibliotecas sao muitos faceis de usar. ´ Python possue uma grande variedade de bibliotecas, alem da ˜ biblioteca padrao a linguagem conta com uma enorme variedade de bibliotecas encontradas no ´ndice de pacotes python, ı http://pypi.python.org/pypi Linguagem com uma produtividade muito grande, tarefas ´ completas com poucas linhas, codigo simples, facilidade de ¸˜ manutencao. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72
  24. 24. Framework SQLAlchemy Conteudo ´ A linguagem Python ¸˜ ˆ Linguagem de programacao dinamica e interpretada de facil ´ aprendizado. Usada em uma grande variedade de dom´nios de aplicacoes, ı ¸˜ Web, processamento de email, tratamento de html e xml, acesso ¸˜ ´ a banco de dados, aplicacoes para rede, interfaces graficas, ¸˜ ¸˜ computacao cient´fica, jogos, educacao, entre outras. ı Clareza da sintaxe, Identacao ¸ ˜ obrigatoria, pequena quantidade de ´ ˜ ´ palavras reservadas, as bibliotecas sao muitos faceis de usar. ´ Python possue uma grande variedade de bibliotecas, alem da ˜ biblioteca padrao a linguagem conta com uma enorme variedade de bibliotecas encontradas no ´ndice de pacotes python, ı http://pypi.python.org/pypi Linguagem com uma produtividade muito grande, tarefas ´ completas com poucas linhas, codigo simples, facilidade de ¸˜ manutencao. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72
  25. 25. Framework SQLAlchemy Conteudo ´ A linguagem Python ¸˜ ˆ Linguagem de programacao dinamica e interpretada de facil ´ aprendizado. Usada em uma grande variedade de dom´nios de aplicacoes, ı ¸˜ Web, processamento de email, tratamento de html e xml, acesso ¸˜ ´ a banco de dados, aplicacoes para rede, interfaces graficas, ¸˜ ¸˜ computacao cient´fica, jogos, educacao, entre outras. ı Clareza da sintaxe, Identacao ¸ ˜ obrigatoria, pequena quantidade de ´ ˜ ´ palavras reservadas, as bibliotecas sao muitos faceis de usar. ´ Python possue uma grande variedade de bibliotecas, alem da ˜ biblioteca padrao a linguagem conta com uma enorme variedade de bibliotecas encontradas no ´ndice de pacotes python, ı http://pypi.python.org/pypi Linguagem com uma produtividade muito grande, tarefas ´ completas com poucas linhas, codigo simples, facilidade de ¸˜ manutencao. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72
  26. 26. Framework SQLAlchemy Conteudo ´ Bancos de dados relacionais ´ Dados: Registros ou ind´cios relacionaveis a alguma entidade ou ı evento.[3]. Dados organizados produzem informaes. Sistemas de Gerenciamento de Bancos de Dados. Modelos: Modelo Orientado a Objetos, Modelos Navegacionais, ´ divididos em Modelo Hierarquico e Modelo em Redes. Modelo relacional: Armazenar dados em tabelas, organizadas em ¸˜ linhas e colunas. Tabelas podem ter relacoes entre si. ˜ Cartoes perfurados, arquivos texto, arquivos estruturados, sistemas de gerenciamento de bancos. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 9 / 72
  27. 27. Framework SQLAlchemy Conteudo ´ Bancos de dados relacionais ´ Dados: Registros ou ind´cios relacionaveis a alguma entidade ou ı evento.[3]. Dados organizados produzem informaes. Sistemas de Gerenciamento de Bancos de Dados. Modelos: Modelo Orientado a Objetos, Modelos Navegacionais, ´ divididos em Modelo Hierarquico e Modelo em Redes. Modelo relacional: Armazenar dados em tabelas, organizadas em ¸˜ linhas e colunas. Tabelas podem ter relacoes entre si. ˜ Cartoes perfurados, arquivos texto, arquivos estruturados, sistemas de gerenciamento de bancos. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 9 / 72
  28. 28. Framework SQLAlchemy Conteudo ´ Bancos de dados relacionais ´ Dados: Registros ou ind´cios relacionaveis a alguma entidade ou ı evento.[3]. Dados organizados produzem informaes. Sistemas de Gerenciamento de Bancos de Dados. Modelos: Modelo Orientado a Objetos, Modelos Navegacionais, ´ divididos em Modelo Hierarquico e Modelo em Redes. Modelo relacional: Armazenar dados em tabelas, organizadas em ¸˜ linhas e colunas. Tabelas podem ter relacoes entre si. ˜ Cartoes perfurados, arquivos texto, arquivos estruturados, sistemas de gerenciamento de bancos. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 9 / 72
  29. 29. Framework SQLAlchemy Conteudo ´ Bancos de dados relacionais ´ Dados: Registros ou ind´cios relacionaveis a alguma entidade ou ı evento.[3]. Dados organizados produzem informaes. Sistemas de Gerenciamento de Bancos de Dados. Modelos: Modelo Orientado a Objetos, Modelos Navegacionais, ´ divididos em Modelo Hierarquico e Modelo em Redes. Modelo relacional: Armazenar dados em tabelas, organizadas em ¸˜ linhas e colunas. Tabelas podem ter relacoes entre si. ˜ Cartoes perfurados, arquivos texto, arquivos estruturados, sistemas de gerenciamento de bancos. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 9 / 72
  30. 30. Framework SQLAlchemy Conteudo ´ Bancos de dados relacionais ´ Dados: Registros ou ind´cios relacionaveis a alguma entidade ou ı evento.[3]. Dados organizados produzem informaes. Sistemas de Gerenciamento de Bancos de Dados. Modelos: Modelo Orientado a Objetos, Modelos Navegacionais, ´ divididos em Modelo Hierarquico e Modelo em Redes. Modelo relacional: Armazenar dados em tabelas, organizadas em ¸˜ linhas e colunas. Tabelas podem ter relacoes entre si. ˜ Cartoes perfurados, arquivos texto, arquivos estruturados, sistemas de gerenciamento de bancos. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 9 / 72
  31. 31. Framework SQLAlchemy Conteudo ´ ¸˜ Orientacao a objetos ¸˜ ´ ¸˜ Evolucao das tecnicas: Programacao estruturada - estruturada modular - orientada a objetos. ¸˜ Orientacao a objetos embutida na linguagem Python, Veja o exemplo: >>> print quot;testequot;.upper() TESTE ´ ´ A constante string ”teste”ja possui metodos de string, como ”upper”. Dados relacionais(linhas e colunas) X Estruturas e elementos das ¸˜ linguagens de programacao. ¸˜ Banco de dados + Orientacao a objetos -> Mapeamento objeto relacional. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72
  32. 32. Framework SQLAlchemy Conteudo ´ ¸˜ Orientacao a objetos ¸˜ ´ ¸˜ Evolucao das tecnicas: Programacao estruturada - estruturada modular - orientada a objetos. ¸˜ Orientacao a objetos embutida na linguagem Python, Veja o exemplo: >>> print quot;testequot;.upper() TESTE ´ ´ A constante string ”teste”ja possui metodos de string, como ”upper”. Dados relacionais(linhas e colunas) X Estruturas e elementos das ¸˜ linguagens de programacao. ¸˜ Banco de dados + Orientacao a objetos -> Mapeamento objeto relacional. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72
  33. 33. Framework SQLAlchemy Conteudo ´ ¸˜ Orientacao a objetos ¸˜ ´ ¸˜ Evolucao das tecnicas: Programacao estruturada - estruturada modular - orientada a objetos. ¸˜ Orientacao a objetos embutida na linguagem Python, Veja o exemplo: >>> print quot;testequot;.upper() TESTE ´ ´ A constante string ”teste”ja possui metodos de string, como ”upper”. Dados relacionais(linhas e colunas) X Estruturas e elementos das ¸˜ linguagens de programacao. ¸˜ Banco de dados + Orientacao a objetos -> Mapeamento objeto relacional. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72
  34. 34. Framework SQLAlchemy Conteudo ´ ¸˜ Orientacao a objetos ¸˜ ´ ¸˜ Evolucao das tecnicas: Programacao estruturada - estruturada modular - orientada a objetos. ¸˜ Orientacao a objetos embutida na linguagem Python, Veja o exemplo: >>> print quot;testequot;.upper() TESTE ´ ´ A constante string ”teste”ja possui metodos de string, como ”upper”. Dados relacionais(linhas e colunas) X Estruturas e elementos das ¸˜ linguagens de programacao. ¸˜ Banco de dados + Orientacao a objetos -> Mapeamento objeto relacional. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72
  35. 35. Framework SQLAlchemy Conteudo ´ Frameworks Arcabouco, que pode ser definido como: Esboco, delineamento ¸ ¸ ¸˜ inicial. Esqueleto. Madeiramento de uma construcao. Estrutura ´ ¸˜ que da suporte para um projeto, organismo ou construcao maior. ´ ´ Na informatica esse termo e usado para descrever uma estrutura ¸˜ ¸˜ a ser usada na construcao e organizacao de sistemas. ¸˜ Um framework fornece bibliotecas e funcoes que ajudam o programador no desenvolvimento organizado de projetos maiores. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72
  36. 36. Framework SQLAlchemy Conteudo ´ Frameworks Arcabouco, que pode ser definido como: Esboco, delineamento ¸ ¸ ¸˜ inicial. Esqueleto. Madeiramento de uma construcao. Estrutura ´ ¸˜ que da suporte para um projeto, organismo ou construcao maior. ´ ´ Na informatica esse termo e usado para descrever uma estrutura ¸˜ ¸˜ a ser usada na construcao e organizacao de sistemas. ¸˜ Um framework fornece bibliotecas e funcoes que ajudam o programador no desenvolvimento organizado de projetos maiores. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72
  37. 37. Framework SQLAlchemy Conteudo ´ Frameworks Arcabouco, que pode ser definido como: Esboco, delineamento ¸ ¸ ¸˜ inicial. Esqueleto. Madeiramento de uma construcao. Estrutura ´ ¸˜ que da suporte para um projeto, organismo ou construcao maior. ´ ´ Na informatica esse termo e usado para descrever uma estrutura ¸˜ ¸˜ a ser usada na construcao e organizacao de sistemas. ¸˜ Um framework fornece bibliotecas e funcoes que ajudam o programador no desenvolvimento organizado de projetos maiores. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72
  38. 38. ˜ Mao na massa Os ingredientes Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 12 / 72
  39. 39. ˜ Mao na massa Os ingredientes ¸˜ Instalacao Assim como a maioria dos programas feitos com a linguagem ` ´ Python a maneira de instalar a partir dos fontes e descompactar e ´ executar dentro do diretorio o comando: # python setup.py install ¸˜ Em distribuicoes derivadas do debian o seguinte comando pode ser executado: # aptitude install python-sqlalchemy python-sqlalchemy-doc ´ ¸˜ E tambem usando a ferramenta setuptools[1], instalacao[2]. # easy install SQLAlchemy Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 13 / 72
  40. 40. ˜ Mao na massa Os ingredientes ¸˜ Instalacao Assim como a maioria dos programas feitos com a linguagem ` ´ Python a maneira de instalar a partir dos fontes e descompactar e ´ executar dentro do diretorio o comando: # python setup.py install ¸˜ Em distribuicoes derivadas do debian o seguinte comando pode ser executado: # aptitude install python-sqlalchemy python-sqlalchemy-doc ´ ¸˜ E tambem usando a ferramenta setuptools[1], instalacao[2]. # easy install SQLAlchemy Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 13 / 72
  41. 41. ˜ Mao na massa Os ingredientes ¸˜ Instalacao Assim como a maioria dos programas feitos com a linguagem ` ´ Python a maneira de instalar a partir dos fontes e descompactar e ´ executar dentro do diretorio o comando: # python setup.py install ¸˜ Em distribuicoes derivadas do debian o seguinte comando pode ser executado: # aptitude install python-sqlalchemy python-sqlalchemy-doc ´ ¸˜ E tambem usando a ferramenta setuptools[1], instalacao[2]. # easy install SQLAlchemy Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 13 / 72
  42. 42. ˜ Mao na massa ¸˜ Preparacao Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 14 / 72
  43. 43. ˜ Mao na massa ¸˜ Preparacao Verso ˜ Obtendo a versao da biblioteca >>> # Acessando a propriedade __version__ obtemos uma >>> # string com a vers˜o da biblioteca instalada. a >>> import sqlalchemy >>> sqlalchemy.__version__ ’0.5.0’ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 15 / 72
  44. 44. ˜ Mao na massa ¸˜ Preparacao ˜ Conexao ´ ´ Conectando um banco de dados sqllite temporario, na memoria do computador >>> ` # Conectando a um banco de dados sqllite tempor´rio, a >>> # na memoria do computador. >>> from sqlalchemy import create_engine >>> # postgres >>> pg_db = create_engine(’postgres://scott:tiger@localhost:5432/mydatabase’) >>> # sqlite (note the four slashes for an absolute path) >>> sqlite_db = create_engine(’sqlite:////absolute/path/to/database.txt’) >>> # mysql >>> mysql_db = create_engine(’mysql://localhost/foo’) >>> # sqllite em mem´ria. o >>> engine = create_engine(’sqlite:///:memory:’, echo=True) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 16 / 72
  45. 45. ˜ Mao na massa ¸˜ Preparacao Modelo ¸˜ Definicao da estrutura do banco >>> from sqlalchemy import Table, Column, Integer >>> from sqlalchemy import String, MetaData, ForeignKey >>> metadata = MetaData() >>> users = Table(’users’, metadata, ... Column(’id’, Integer, primary_key=True), ... Column(’name’, String(50)), ... Column(’fullname’, String((50)), ... ) >>> addresses = Table(’addresses’, metadata, ... Column(’id’, Integer, primary_key=True), ... Column(’user_id’, None, ForeignKey(’users.id’)), ... Column(’email_address’, String(100), nullable=False) ... ) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 17 / 72
  46. 46. ˜ Mao na massa ¸˜ Preparacao ¸˜ Criacao Criando as tabelas no banco ¸˜ >>> # Criacao das tabelas no banco. >>> metadata.create_all(engine) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 18 / 72
  47. 47. ˜ Mao na massa ¸˜ Preparacao As classes Criando uma classe em python >>> class User(object): ... def __init__(self, name, fullname, password): ... self.name = name ... self.fullname = fullname ... self.password = password ... ... # M´todo que quot;representaquot; o objeto, por e ... # exemplo ao usar o comando quot;print objetoquot; ... def __repr__(self): ... return quot;<User(’%s’,’%s’, ’%s’)>quot; % (self.name, ... self.fullname, ... self.password) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 19 / 72
  48. 48. ˜ Mao na massa ¸˜ Preparacao O Mapeamento Definido o mapeamento >>> from sqlalchemy.orm import mapper >>> mapper(User, users_table) <Mapper at 0x...; User> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 20 / 72
  49. 49. ˜ Mao na massa ¸˜ Utilizacao da biblioteca Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 21 / 72
  50. 50. ˜ Mao na massa ¸˜ Utilizacao da biblioteca Criando objetos ¸˜ A criacao de um objeto ¸˜ >>> # A criacao de um novo registro segue os padr˜es de o >>> # objetos python. >>> ed_user = User(’ed’, ’Ed Jones’, ’edspassword’) >>> ed_user.name ’ed’ >>> ed_user.password ’edspassword’ >>> str(ed_user.id) ’None’ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 22 / 72
  51. 51. ˜ Mao na massa ¸˜ Utilizacao da biblioteca ˜ Sessoes ˜ Definindo e criando sessoes >>> # Com o comando sessionmaker criamos uma >>> # fabrica de sess˜es. o >>> from sqlalchemy.orm import sessionmaker >>> Session = sessionmaker(bind=engine) >>> session = Session() Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 23 / 72
  52. 52. ˜ Mao na massa ¸˜ Utilizacao da biblioteca Persistencia Persistencia no banco ` >>> # Para persistir o objeto ed_user, adicionamos a sess˜o. a >>> # Assim que for necess´rio o comando INSERT ser´ executado. a a >>> ed_user = User(’ed’, ’Ed Jones’, ’edspassword’) >>> session.add(ed_user) >>> our_user = session.query(User). ... filter_by(name=’ed’). ... first() # INSERT e SELECT >>> ed_user is our_user True Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 24 / 72
  53. 53. ˜ Mao na massa ¸˜ Utilizacao da biblioteca Salvando lista de objetos ´ Adicionando varios objetos de uma vez # Adicionando uma lista de usu´rios. a >>> session.add_all([ ... User(’wendy’, ’Wendy Williams’, ’foobar’), ... User(’mary’, ’Mary Contrary’, ’xxg527’), ... User(’fred’, ’Fred Flinstone’, ’blah’)]) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 25 / 72
  54. 54. ˜ Mao na massa ¸˜ Utilizacao da biblioteca ¸˜ Alteracao ¸˜ ¸˜ Alteracao e confirmacao >>> ed_user.password = ’f8s7ccs’ >>> session.dirty IdentitySet([<User(’ed’,’Ed Jones’, ’f8s7ccs’)>]) >>> session.new IdentitySet([ <User(’wendy’,’Wendy Williams’, ’foobar’)>, <User(’mary’,’Mary Contrary’, ’xxg527’)>, <User(’fred’,’Fred Flinstone’, ’blah’)>]) >>> session.commit() >>> ed_user.id Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 26 / 72
  55. 55. ˜ Mao na massa ¸˜ Utilizacao da biblioteca Desfazendo mudancas ¸ Alterando e desfazendo as mudancas ¸ >>> ed_user.name = ’Edwardo’ >>> fake_user = User(’fakeuser’, ’Invalid’, ’12345’) >>> session.add(fake_user) >>> session.query(User).filter(User.name. ... in_([’Edwardo’, ’fakeuser’])).all() [<User(’Edwardo’,’Ed Jones’, ’f8s7ccs’)>, <User(’fakeuser’,’Invalid’, ’12345’)>] >>> session.rollback() >>> ed_user.name >>> fake_user in session False >>> session.query(User).filter(User.name. ... in_([’ed’, ’fakeuser’])).all() [<User(’ed’,’Ed Jones’, ’f8s7ccs’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 27 / 72
  56. 56. ˜ Mao na massa Consultando Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 28 / 72
  57. 57. ˜ Mao na massa Consultando Obtendo objetos Iterando por objetos ¸˜ >>> # Cada iteracao retorna um objeto usu´rio. a >>> for instance in session.query(User). ... order_by(User.id): ... print instance.name, instance.fullname Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 29 / 72
  58. 58. ˜ Mao na massa Consultando Obtendo tuplas Iterando por tuplas ¸˜ >>> # Para cada iteracao as vari´veis recebem os a >>> # valores das propriedades dos registros. >>> for name, fullname in session. query(User.name, User.fullname): ... print name, fullname Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 30 / 72
  59. 59. ˜ Mao na massa Consultando Obtendo tuplas com objetos Tuplas com objetos e valores ¸˜ >>> # Cada iteracao retorna uma tupla com os valores das propriedades. >>> for name, fullname in session.query(User.name, User.fullname): ... print name, fullname Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 31 / 72
  60. 60. ˜ Mao na massa Consultando ¸˜ Aplicando limites e paginacao Limitando os resultados com fatiamento(slice) de listas >>> # O seguinte slice aplica um limite de 2 e deslocamento 0. >>> for u in session.query(User).order_by(User.id)[1:3]: ... print u >>> # O seguinte slice aplica um limite de 2 e deslocamento 3. >>> for u in session.query(User).order_by(User.id)[3:5]: ... print u >>> # Navegando de dois em dois. >>> for u in session.query(User).order_by(User.id)[::2]: ... print u Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 32 / 72
  61. 61. ˜ Mao na massa Consultando Filtrando Com filtros usando argumentos com palavras chave >>> # Os parametros com palavra chave s˜o usados para a >>> # montar o where. >>> for name, in session.query(User.name). ... filter_by(fullname=’Ed Jones’): ... print name Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 33 / 72
  62. 62. ˜ Mao na massa Consultando ˜ Usando expressoes ˜ Filtros usando expressoes python >>> # Operadores python podem ser usados com atributos de >>> # classe. >>> for name, in session.query(User.name). ... filter(User.fullname==’Ed Jones’): ... print name Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 34 / 72
  63. 63. ˜ Mao na massa Consultando ”Join”encadeando filtros ”filter”retorna objetos query ¸˜ >>> # Cada iteracao retorna um objeto usu´rio. a >>> for instance in session.query(User). ... order_by(User.id): ... print instance.name, instance.fullname Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 35 / 72
  64. 64. ˜ Mao na massa Operadores Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 36 / 72
  65. 65. ˜ Mao na massa Operadores Igualdade Operador de igualdade # Operador de igualdade. query.filter(User.name == ’ed’) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 37 / 72
  66. 66. ˜ Mao na massa Operadores Diferenca ¸ Operador de diferenca ¸ # Operador diferente. query.filter(User.name != ’ed’) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 38 / 72
  67. 67. ˜ Mao na massa Operadores Semelhanca ¸ Operador de semelhanca ¸ # Operador de semelhanca. ¸ query.filter(User.name.like(’%ed%’)) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 39 / 72
  68. 68. ˜ Mao na massa Operadores ´ Contem Operador de conteudo ´ # Operador IN. query.filter(User.name.in_([’ed’, ’wendy’, ’jack’])) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 40 / 72
  69. 69. ˜ Mao na massa Operadores Nulo Testar campo nulo ´ # Verificando se e nulo. filter(User.name == None) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 41 / 72
  70. 70. ˜ Mao na massa Operadores ´ ”E”logico ´ Operador logico ”E” # Usando operador AND. from sqlalchemy import and_ filter(and_(User.name == ’ed’, User.fullname == ’Ed Jones’)) e ´ # tamb´m e poss´vel chamar filter()/filter_by() ı # v´rias vezes. a filter(User.name == ’ed’).filter(User.fullname == ’Ed Jones’) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 42 / 72
  71. 71. ˜ Mao na massa Operadores ´ ”OU”logico ´ Operador logico ”OU” >>> # Usando o operador or. >>> from sqlalchemy import or_ >>> q= session.query(User).filter(or_(User.name == ’ed’, User.name == ’wendy’)) <sqlalchemy.orm.query.Query object at 0x2286ed0> >>> q.all() Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 43 / 72
  72. 72. ˜ Mao na massa Operadores ”Match” Equivalencia # Match tem efeitos que dependem do banco de dados. query.filter(User.name.match(’wendy’)) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 44 / 72
  73. 73. ˜ Mao na massa Receitas alternativas Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 45 / 72
  74. 74. ˜ Mao na massa Receitas alternativas Obtendo uma lista ´ O metodo all() retorna uma lista >>> # Lista de objetos com o metodo all() >>> query = session.query(User).filter( User.name.like(’%ed’) ).order_by(User.id) >>> query.all() [<User(’ed’,’Ed Jones’, ’f8s7ccs’)>, <User(’fred’,’Fred Flinstone’, ’blah’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 46 / 72
  75. 75. ˜ Mao na massa Receitas alternativas Primeiro elemento ´ O metodo first() aplica um limite de 1 e retorna o primeiro registro do resultado >>> # first aplica um limite de 1 com deslocamento 0. >>> query.first() <User(’ed’,’Ed Jones’, ’f8s7ccs’)> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 47 / 72
  76. 76. ˜ Mao na massa Receitas alternativas Otendo linha unica ´ ´ ¸˜ ˜ O metodo one() aplica um limite de dois e dispara excecao caso nao obtenha uma e apenas uma linha >>> ¸˜ # Excecoes s˜o disparadas caso o resultado de one a >>> # seja maior que um ou menor que um. >>> try: ... user = query.one() ... except Exception, e: ... print e Multiple rows were found for one() >>> try: ... user = query.filter(User.id == 99).one() ... except Exception, e: ... print e No row was found for one() Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 48 / 72
  77. 77. ˜ Mao na massa Receitas alternativas ˜ Expressoes SQL ˜ Pode-se usar expressoes SQL ¸˜ >>> # Passando condicoes com sql usando de strings. >>> for user in session.query(User).filter(quot;id<224quot;). ... order_by(quot;idquot;).all(): ... print user.name Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 49 / 72
  78. 78. ˜ Mao na massa Receitas alternativas Parametros SQL Parametros bind # Parametros BIND. >>> session.query(User). ... filter(quot;id<:value and name=:namequot;). ... params(value=224, name=’fred’). ... order_by(User.id).one() <User(’fred’,’Fred Flinstone’, ’blah’)> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 50 / 72
  79. 79. ˜ Mao na massa Receitas alternativas Comando SQL ´ SQL completo, necessario manter os nomes dos atributos mapeados. >>> # Comandos SQL com o m´todo from_statement. e >>> # Os nomes das colunas devem ser os mesmos que os >>> # nomes usados no mapper. >>> session.query(User).from_statement( ... quot;SELECT * FROM users where name=:namequot;). ... params(name=’ed’).all() [<User(’ed’,’Ed Jones’, ’f8s7ccs’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 51 / 72
  80. 80. ˜ Mao na massa Relacionamento Roteiro 1 ¸˜ Introducao Sobre o palestrante Sobre a palestra 2 Framework SQLAlchemy Conteudo ´ 3 ˜ Mao na massa Os ingredientes ¸˜ Preparacao ¸˜ Utilizacao da biblioteca Consultando Operadores Receitas alternativas Relacionamento 4 Bibliografia Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 52 / 72
  81. 81. ˜ Mao na massa Relacionamento ¸˜ Relacao declarativa ¸˜ Especificando a relacao de forma declarativa >>> from sqlalchemy import ForeignKey >>> from sqlalchemy.orm import relation, backref >>> class Address(Base): ... __tablename__ = ’addresses’ ... id = Column(Integer, primary_key=True) ... email_address = Column(String, nullable=False) ... user_id = Column(Integer, ForeignKey(’users.id’)) ... ... user = relation(User, backref=backref(’addresses’, ... order_by=id)) ... ... def __init__(self, email_address): ... self.email_address = email_address ... ... def __repr__(self): ... return quot;<Address(’%s’)>quot; % self.email_address Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 53 / 72
  82. 82. ˜ Mao na massa Relacionamento ”BackRef” ¸˜ Na direcao oposta ¸˜ # A flexibilidade da funcao relation() permite a ¸˜ # definicao na classe User. class User(Base): .... addresses = relation(Address, order_by=Address.id, backref=quot;userquot;) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 54 / 72
  83. 83. ˜ Mao na massa Relacionamento Aplicando a estrutura Criando as estruturas no banco ¸˜ >>> # Criacao das tabelas no banco. >>> Base.metadata.create_all(engine) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 55 / 72
  84. 84. ˜ Mao na massa Relacionamento Novo objeto relacionado ´ ˜ Novos usuarios nao tem email inicialmente >>> # Novo objeto sem enderecos de email. ¸ >>> jack = User(’jack’, ’Jack Bean’, ’gjffdd’) >>> jack.addresses [] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 56 / 72
  85. 85. ˜ Mao na massa Relacionamento Lista de enderecos ¸ Podemos adicionar uma lista diretamente # Acessando o relacionamento. >>> jack.addresses [<Address(’jack@google.com’)>, <Address(’j25@yahoo.com’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 57 / 72
  86. 86. ˜ Mao na massa Relacionamento ¸˜ Visibilidade nas duas direcoes ˜ ¸˜ Relacionamentos bidirecionais sao vis´veis nas duas direcoes ı >>> # Usu´rio possui enderecos e enderecos s˜o de algum usu´rio. a ¸ ¸ a a >>> jack.addresses[1] <Address(’j25@yahoo.com’)> >>> jack.addresses[1].user <User(’jack’,’Jack Bean’, ’gjffdd’)> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 58 / 72
  87. 87. ˜ Mao na massa Relacionamento ”Commitando” ¸˜ Salvando as informacoes no banco >>> # Persistindo o novo usu´rio. a >>> session.add(jack) >>> session.commit() Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 59 / 72
  88. 88. ˜ Mao na massa Relacionamento Economia de recursos ˜ As consultas ao banco sao feitas sob demanda >>> # Ao selecionar o usu´rio, o SQL para os enderecos a ¸ a ´ >>> # n˜o e executado. >>> jack = session.query(User). ... filter_by(name=’jack’).one() >>> jack <User(’jack’,’Jack Bean’, ’gjffdd’)> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 60 / 72
  89. 89. ˜ Mao na massa Relacionamento Agora os enderecos ¸ ¸˜ Selecao de acordo com a necessidade # Acessando o relacionamento. >>> jack.addresses [<Address(’jack@google.com’)>, <Address(’j25@yahoo.com’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 61 / 72
  90. 90. ˜ Mao na massa Relacionamento Economia de acessos ´ Se for o caso e poss´vel buscar tudo antes.(eagerload) ı >>> # Com eagerload os enderecos s˜o obtidos juntamente com o ¸ a >>> # usu´rio. a >>> from sqlalchemy.orm import eagerload >>> jack = session.query(User).options( ... eagerload(’addresses’)). ... filter_by(name=’jack’).one() >>> jack <User(’jack’,’Jack Bean’, ’gjffdd’)> >>> jack.addresses [<Address(’jack@google.com’)>, <Address(’j25@yahoo.com’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 62 / 72
  91. 91. ˜ Mao na massa Relacionamento ¸˜ Juntando relacoes Inner join, usando filter() >>> # Usando filtros generativamente para o join. >>> for u, a in session.query(User, Address). ... filter(User.id==Address.user_id).filter( ... Address.email_address==’jack@google.com’). ... all(): ... print u, a <User(’jack’,’Jack Bean’, ’gjffdd’)> <Address(’jack@google.com’)> Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 63 / 72
  92. 92. ˜ Mao na massa Relacionamento Relacionando com join ¸˜ Usando a funcao join() >>> # Usando join com o m´todo select_from. e >>> from sqlalchemy.orm import join >>> session.query(User).select_from(join(User, ... Address)).filter( ... Address.email_address==’jack@google.com’). ... all() [<User(’jack’,’Jack Bean’, ’gjffdd’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 64 / 72
  93. 93. ˜ Mao na massa Relacionamento Clausula ”on” ´ E poss´vel indicar a clausula on do join ı ¸˜ # condicao explic´ta ı join(User, Address, User.id==Address.user_id) ¸˜ # Especif´ca relacao da esquerda para direita ı join(User, Address, User.addresses) # o mesmo, usando uma string join(User, Address, ’addresses’) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 65 / 72
  94. 94. ˜ Mao na massa Relacionamento join em query Aplicando o join() em objetos Query >>> # Aplicando o join no objeto Query. >>> session.query(User).join(User.addresses). ... filter(Address.email_address==’jack@google.com’).all() [<User(’jack’,’Jack Bean’, ’gjffdd’)>] Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 66 / 72
  95. 95. ˜ Mao na massa Relacionamento ”Target” ¸˜ Explicitando o alvo da ligacao # Join especificando a propriedade alvo do relacionamento. session.query(User).join((Address, User.addresses)) Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 67 / 72
  96. 96. ˜ Mao na massa Relacionamento ˆ Referencias Python - http://www.python.org PythonBrasil - http://www.pythonbrasil.com.br GruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPr SQLAlchemy - http://www.sqlalchemy.org Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72
  97. 97. ˜ Mao na massa Relacionamento ˆ Referencias Python - http://www.python.org PythonBrasil - http://www.pythonbrasil.com.br GruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPr SQLAlchemy - http://www.sqlalchemy.org Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72
  98. 98. ˜ Mao na massa Relacionamento ˆ Referencias Python - http://www.python.org PythonBrasil - http://www.pythonbrasil.com.br GruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPr SQLAlchemy - http://www.sqlalchemy.org Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72
  99. 99. ˜ Mao na massa Relacionamento ˆ Referencias Python - http://www.python.org PythonBrasil - http://www.pythonbrasil.com.br GruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPr SQLAlchemy - http://www.sqlalchemy.org Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72
  100. 100. ´ Sumario ´ Sumario ¸˜ Introducao Sobre o palestrante Sobre a palestra Caracter´sticas - SQLAlchemy ı ¸˜ Utilizacao Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72
  101. 101. ´ Sumario ´ Sumario ¸˜ Introducao Sobre o palestrante Sobre a palestra Caracter´sticas - SQLAlchemy ı ¸˜ Utilizacao Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72
  102. 102. ´ Sumario ´ Sumario ¸˜ Introducao Sobre o palestrante Sobre a palestra Caracter´sticas - SQLAlchemy ı ¸˜ Utilizacao Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72
  103. 103. ´ Sumario ´ Sumario ¸˜ Introducao Sobre o palestrante Sobre a palestra Caracter´sticas - SQLAlchemy ı ¸˜ Utilizacao Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72
  104. 104. ´ Sumario ´ Sumario ¸˜ Introducao Sobre o palestrante Sobre a palestra Caracter´sticas - SQLAlchemy ı ¸˜ Utilizacao Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72
  105. 105. Bibliografia Bibliografia [1] SetupTools1. http://peak.telecommunity.com/DevCenter/setuptools, 3 September 2008. [2] SetupTools2. http://peak.telecommunity.com/DevCenter/EasyInstall# installation-instructions, 3 September 2008. [3] WikiPed1. http://pt.wikipedia.org/wiki/Dados, 2 September 2008. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 70 / 72
  106. 106. Bibliografia Bibliografia [1] SetupTools1. http://peak.telecommunity.com/DevCenter/setuptools, 3 September 2008. [2] SetupTools2. http://peak.telecommunity.com/DevCenter/EasyInstall# installation-instructions, 3 September 2008. [3] WikiPed1. http://pt.wikipedia.org/wiki/Dados, 2 September 2008. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 70 / 72
  107. 107. Bibliografia Bibliografia [1] SetupTools1. http://peak.telecommunity.com/DevCenter/setuptools, 3 September 2008. [2] SetupTools2. http://peak.telecommunity.com/DevCenter/EasyInstall# installation-instructions, 3 September 2008. [3] WikiPed1. http://pt.wikipedia.org/wiki/Dados, 2 September 2008. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 70 / 72
  108. 108. Bibliografia Agradecimentos ¸˜ ˆ ASCAM-PR, Associacao de Servidores de Camaras Municipais ´ da Parana. ¸˜ ˆ ABRASCAM, Associacao Brasileira de Servidores de Camaras Municipais. ¸˜ Comunidade Python Brasil e APyBR, Associacao Python Brasil. Comunidade de Software Livre. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72
  109. 109. Bibliografia Agradecimentos ¸˜ ˆ ASCAM-PR, Associacao de Servidores de Camaras Municipais ´ da Parana. ¸˜ ˆ ABRASCAM, Associacao Brasileira de Servidores de Camaras Municipais. ¸˜ Comunidade Python Brasil e APyBR, Associacao Python Brasil. Comunidade de Software Livre. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72
  110. 110. Bibliografia Agradecimentos ¸˜ ˆ ASCAM-PR, Associacao de Servidores de Camaras Municipais ´ da Parana. ¸˜ ˆ ABRASCAM, Associacao Brasileira de Servidores de Camaras Municipais. ¸˜ Comunidade Python Brasil e APyBR, Associacao Python Brasil. Comunidade de Software Livre. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72
  111. 111. Bibliografia Agradecimentos ¸˜ ˆ ASCAM-PR, Associacao de Servidores de Camaras Municipais ´ da Parana. ¸˜ ˆ ABRASCAM, Associacao Brasileira de Servidores de Camaras Municipais. ¸˜ Comunidade Python Brasil e APyBR, Associacao Python Brasil. Comunidade de Software Livre. Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72
  112. 112. Bibliografia ˜ Conclusao ´ ´ Python e uma linguagem muito bacana, facil de aprender, poderosa e produtiva, aliada a gama de bibliotecas e frameworks torna-se hoje um conhecimento muito valioso, empresas como Nokia, Globo e Google procuram profissionais com esse conhecimento pelo mundo todo. ´ Usar essa tecnologia para trabalhar com bancos de dados e bem ¸˜ tranquilo e possui inumeras opcoes. ´ Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 72 / 72
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×