SQLAlchemy - A magia do mapeamento objeto relacional

Preview:

DESCRIPTION

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.

Citation preview

A magia do mapeamento objeto relacional comSQLAlchemy

Python ORM(Mapeamento objeto relacional)

Ramiro Luz2

1Associacao Python Brasil - APyBR

2Comunidade de usuarios Python BrasileiraGrupo 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

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 2 / 72

Introducao Sobre o palestrante

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 3 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

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-PRhttp://www.debian-pr.org/Grupo de usuarios da linguagem Python do Parana, GruPy-PRhttp://www.pythonbrasil.com.br/moin.cgi/GrupyPrMembro suplente do Conselho Deliberativo da Associacao PythonBrasil, http://associacao.pythonbrasil.org/

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 4 / 72

Introducao Sobre a palestra

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 5 / 72

Introducao Sobre a palestra

Conceitos

ProgramacaoBancos de dadosOrientacao a objetosTermos tecnicos usados na palestra.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72

Introducao Sobre a palestra

Conceitos

ProgramacaoBancos de dadosOrientacao a objetosTermos tecnicos usados na palestra.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72

Introducao Sobre a palestra

Conceitos

ProgramacaoBancos de dadosOrientacao a objetosTermos tecnicos usados na palestra.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72

Introducao Sobre a palestra

Conceitos

ProgramacaoBancos de dadosOrientacao a objetosTermos tecnicos usados na palestra.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 6 / 72

Framework SQLAlchemy Conteudo

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 7 / 72

Framework SQLAlchemy Conteudo

A linguagem Python

Linguagem de programacao dinamica e interpretada de facilaprendizado.Usada em uma grande variedade de domınios de aplicacoes,Web, processamento de email, tratamento de html e xml, acessoa banco de dados, aplicacoes para rede, interfaces graficas,computacao cientıfica, jogos, educacao, entre outras.Clareza da sintaxe, Identacao obrigatoria, pequena quantidade depalavras reservadas, as bibliotecas sao muitos faceis de usar.Python possue uma grande variedade de bibliotecas, alem dabiblioteca padrao a linguagem conta com uma enorme variedadede bibliotecas encontradas no ındice de pacotes python,http://pypi.python.org/pypiLinguagem com uma produtividade muito grande, tarefascompletas com poucas linhas, codigo simples, facilidade demanutencao.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72

Framework SQLAlchemy Conteudo

A linguagem Python

Linguagem de programacao dinamica e interpretada de facilaprendizado.Usada em uma grande variedade de domınios de aplicacoes,Web, processamento de email, tratamento de html e xml, acessoa banco de dados, aplicacoes para rede, interfaces graficas,computacao cientıfica, jogos, educacao, entre outras.Clareza da sintaxe, Identacao obrigatoria, pequena quantidade depalavras reservadas, as bibliotecas sao muitos faceis de usar.Python possue uma grande variedade de bibliotecas, alem dabiblioteca padrao a linguagem conta com uma enorme variedadede bibliotecas encontradas no ındice de pacotes python,http://pypi.python.org/pypiLinguagem com uma produtividade muito grande, tarefascompletas com poucas linhas, codigo simples, facilidade demanutencao.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72

Framework SQLAlchemy Conteudo

A linguagem Python

Linguagem de programacao dinamica e interpretada de facilaprendizado.Usada em uma grande variedade de domınios de aplicacoes,Web, processamento de email, tratamento de html e xml, acessoa banco de dados, aplicacoes para rede, interfaces graficas,computacao cientıfica, jogos, educacao, entre outras.Clareza da sintaxe, Identacao obrigatoria, pequena quantidade depalavras reservadas, as bibliotecas sao muitos faceis de usar.Python possue uma grande variedade de bibliotecas, alem dabiblioteca padrao a linguagem conta com uma enorme variedadede bibliotecas encontradas no ındice de pacotes python,http://pypi.python.org/pypiLinguagem com uma produtividade muito grande, tarefascompletas com poucas linhas, codigo simples, facilidade demanutencao.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72

Framework SQLAlchemy Conteudo

A linguagem Python

Linguagem de programacao dinamica e interpretada de facilaprendizado.Usada em uma grande variedade de domınios de aplicacoes,Web, processamento de email, tratamento de html e xml, acessoa banco de dados, aplicacoes para rede, interfaces graficas,computacao cientıfica, jogos, educacao, entre outras.Clareza da sintaxe, Identacao obrigatoria, pequena quantidade depalavras reservadas, as bibliotecas sao muitos faceis de usar.Python possue uma grande variedade de bibliotecas, alem dabiblioteca padrao a linguagem conta com uma enorme variedadede bibliotecas encontradas no ındice de pacotes python,http://pypi.python.org/pypiLinguagem com uma produtividade muito grande, tarefascompletas com poucas linhas, codigo simples, facilidade demanutencao.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72

Framework SQLAlchemy Conteudo

A linguagem Python

Linguagem de programacao dinamica e interpretada de facilaprendizado.Usada em uma grande variedade de domınios de aplicacoes,Web, processamento de email, tratamento de html e xml, acessoa banco de dados, aplicacoes para rede, interfaces graficas,computacao cientıfica, jogos, educacao, entre outras.Clareza da sintaxe, Identacao obrigatoria, pequena quantidade depalavras reservadas, as bibliotecas sao muitos faceis de usar.Python possue uma grande variedade de bibliotecas, alem dabiblioteca padrao a linguagem conta com uma enorme variedadede bibliotecas encontradas no ındice de pacotes python,http://pypi.python.org/pypiLinguagem com uma produtividade muito grande, tarefascompletas com poucas linhas, codigo simples, facilidade demanutencao.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 8 / 72

Framework SQLAlchemy Conteudo

Bancos de dados relacionais

Dados: Registros ou indıcios relacionaveis a alguma entidade ouevento.[3].Dados organizados produzem informaes. Sistemas deGerenciamento 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 emlinhas 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

Framework SQLAlchemy Conteudo

Bancos de dados relacionais

Dados: Registros ou indıcios relacionaveis a alguma entidade ouevento.[3].Dados organizados produzem informaes. Sistemas deGerenciamento 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 emlinhas 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

Framework SQLAlchemy Conteudo

Bancos de dados relacionais

Dados: Registros ou indıcios relacionaveis a alguma entidade ouevento.[3].Dados organizados produzem informaes. Sistemas deGerenciamento 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 emlinhas 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

Framework SQLAlchemy Conteudo

Bancos de dados relacionais

Dados: Registros ou indıcios relacionaveis a alguma entidade ouevento.[3].Dados organizados produzem informaes. Sistemas deGerenciamento 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 emlinhas 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

Framework SQLAlchemy Conteudo

Bancos de dados relacionais

Dados: Registros ou indıcios relacionaveis a alguma entidade ouevento.[3].Dados organizados produzem informaes. Sistemas deGerenciamento 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 emlinhas 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

Framework SQLAlchemy Conteudo

Orientacao a objetos

Evolucao das tecnicas: Programacao estruturada - estruturadamodular - orientada a objetos.Orientacao a objetos embutida na linguagem Python, Veja oexemplo:>>> print "teste".upper()TESTE

A constante string ”teste”ja possui metodos de string, como”upper”.Dados relacionais(linhas e colunas) X Estruturas e elementos daslinguagens de programacao.Banco de dados + Orientacao a objetos -> Mapeamentoobjeto relacional.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72

Framework SQLAlchemy Conteudo

Orientacao a objetos

Evolucao das tecnicas: Programacao estruturada - estruturadamodular - orientada a objetos.Orientacao a objetos embutida na linguagem Python, Veja oexemplo:>>> print "teste".upper()TESTE

A constante string ”teste”ja possui metodos de string, como”upper”.Dados relacionais(linhas e colunas) X Estruturas e elementos daslinguagens de programacao.Banco de dados + Orientacao a objetos -> Mapeamentoobjeto relacional.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72

Framework SQLAlchemy Conteudo

Orientacao a objetos

Evolucao das tecnicas: Programacao estruturada - estruturadamodular - orientada a objetos.Orientacao a objetos embutida na linguagem Python, Veja oexemplo:>>> print "teste".upper()TESTE

A constante string ”teste”ja possui metodos de string, como”upper”.Dados relacionais(linhas e colunas) X Estruturas e elementos daslinguagens de programacao.Banco de dados + Orientacao a objetos -> Mapeamentoobjeto relacional.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72

Framework SQLAlchemy Conteudo

Orientacao a objetos

Evolucao das tecnicas: Programacao estruturada - estruturadamodular - orientada a objetos.Orientacao a objetos embutida na linguagem Python, Veja oexemplo:>>> print "teste".upper()TESTE

A constante string ”teste”ja possui metodos de string, como”upper”.Dados relacionais(linhas e colunas) X Estruturas e elementos daslinguagens de programacao.Banco de dados + Orientacao a objetos -> Mapeamentoobjeto relacional.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 10 / 72

Framework SQLAlchemy Conteudo

Frameworks

Arcabouco, que pode ser definido como: Esboco, delineamentoinicial. Esqueleto. Madeiramento de uma construcao. Estruturaque da suporte para um projeto, organismo ou construcao maior.Na informatica esse termo e usado para descrever uma estruturaa ser usada na construcao e organizacao de sistemas.Um framework fornece bibliotecas e funcoes que ajudam oprogramador no desenvolvimento organizado de projetos maiores.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72

Framework SQLAlchemy Conteudo

Frameworks

Arcabouco, que pode ser definido como: Esboco, delineamentoinicial. Esqueleto. Madeiramento de uma construcao. Estruturaque da suporte para um projeto, organismo ou construcao maior.Na informatica esse termo e usado para descrever uma estruturaa ser usada na construcao e organizacao de sistemas.Um framework fornece bibliotecas e funcoes que ajudam oprogramador no desenvolvimento organizado de projetos maiores.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72

Framework SQLAlchemy Conteudo

Frameworks

Arcabouco, que pode ser definido como: Esboco, delineamentoinicial. Esqueleto. Madeiramento de uma construcao. Estruturaque da suporte para um projeto, organismo ou construcao maior.Na informatica esse termo e usado para descrever uma estruturaa ser usada na construcao e organizacao de sistemas.Um framework fornece bibliotecas e funcoes que ajudam oprogramador no desenvolvimento organizado de projetos maiores.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 11 / 72

Mao na massa Os ingredientes

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 12 / 72

Mao na massa Os ingredientes

Instalacao

Assim como a maioria dos programas feitos com a linguagemPython a maneira de instalar a partir dos fontes e descompactar eexecutar dentro do diretorio o comando:# python setup.py install

Em distribuicoes derivadas do debian o seguinte comando podeser 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

Mao na massa Os ingredientes

Instalacao

Assim como a maioria dos programas feitos com a linguagemPython a maneira de instalar a partir dos fontes e descompactar eexecutar dentro do diretorio o comando:# python setup.py install

Em distribuicoes derivadas do debian o seguinte comando podeser 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

Mao na massa Os ingredientes

Instalacao

Assim como a maioria dos programas feitos com a linguagemPython a maneira de instalar a partir dos fontes e descompactar eexecutar dentro do diretorio o comando:# python setup.py install

Em distribuicoes derivadas do debian o seguinte comando podeser 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

Mao na massa Preparacao

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 14 / 72

Mao na massa Preparacao

Verso

Obtendo a versao da biblioteca

>>> # Acessando a propriedade __version__ obtemos uma>>> # string com a versao da biblioteca instalada.>>> import sqlalchemy>>> sqlalchemy.__version__’0.5.0’

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 15 / 72

Mao na massa Preparacao

Conexao

Conectando um banco de dados sqllite temporario, na memoria docomputador

>>> # Conectando a um banco de dados sqllite temporario,>>> # 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 memoria.>>> engine = create_engine(’sqlite:///:memory:’, echo=True)

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 16 / 72

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

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

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...... # Metodo que "representa" o objeto, por... # exemplo ao usar o comando "print objeto"... def __repr__(self):... return "<User(’%s’,’%s’, ’%s’)>" % (self.name, \... self.fullname, \... self.password)

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 19 / 72

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

Mao na massa Utilizacao da biblioteca

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 21 / 72

Mao na massa Utilizacao da biblioteca

Criando objetos

A criacao de um objeto

>>> # A criacao de um novo registro segue os padroes de>>> # 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

Mao na massa Utilizacao da biblioteca

Sessoes

Definindo e criando sessoes

>>> # Com o comando sessionmaker criamos uma>>> # fabrica de sessoes.>>> from sqlalchemy.orm import sessionmaker>>> Session = sessionmaker(bind=engine)>>> session = Session()

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 23 / 72

Mao na massa Utilizacao da biblioteca

Persistencia

Persistencia no banco

>>> # Para persistir o objeto ed_user, adicionamos a sessao.>>> # Assim que for necessario o comando INSERT sera executado.>>> 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_userTrue

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 24 / 72

Mao na massa Utilizacao da biblioteca

Salvando lista de objetos

Adicionando varios objetos de uma vez

# Adicionando uma lista de usuarios.>>> 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

Mao na massa Utilizacao da biblioteca

Alteracao

Alteracao e confirmacao

>>> ed_user.password = ’f8s7ccs’>>> session.dirtyIdentitySet([<User(’ed’,’Ed Jones’, ’f8s7ccs’)>])>>> session.newIdentitySet([<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

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 sessionFalse>>> 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

Mao na massa Consultando

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 28 / 72

Mao na massa Consultando

Obtendo objetos

Iterando por objetos

>>> # Cada iteracao retorna um objeto usuario.>>> 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

Mao na massa Consultando

Obtendo tuplas

Iterando por tuplas

>>> # Para cada iteracao as variaveis recebem os>>> # 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

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

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

Mao na massa Consultando

Filtrando

Com filtros usando argumentos com palavras chave

>>> # Os parametros com palavra chave sao usados para>>> # 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

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

Mao na massa Consultando

”Join”encadeando filtros

”filter”retorna objetos query

>>> # Cada iteracao retorna um objeto usuario.>>> 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

Mao na massa Operadores

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 36 / 72

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

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

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

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

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

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’))

# tambem e possıvel chamar filter()/filter_by()# varias vezes.filter(User.name == ’ed’).filter(User.fullname == ’Ed Jones’)

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 42 / 72

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

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

Mao na massa Receitas alternativas

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 45 / 72

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

Mao na massa Receitas alternativas

Primeiro elemento

O metodo first() aplica um limite de 1 e retorna o primeiro registro doresultado

>>> # 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

Mao na massa Receitas alternativas

Otendo linha unica

O metodo one() aplica um limite de dois e dispara excecao caso naoobtenha uma e apenas uma linha

>>> # Excecoes sao disparadas caso o resultado de one>>> # 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

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("id<224").\... order_by("id").all():... print user.name

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 49 / 72

Mao na massa Receitas alternativas

Parametros SQL

Parametros bind

# Parametros BIND.>>> session.query(User).\... filter("id<:value and name=:name").\... 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

Mao na massa Receitas alternativas

Comando SQL

SQL completo, necessario manter os nomes dos atributos mapeados.

>>> # Comandos SQL com o metodo from_statement.>>> # Os nomes das colunas devem ser os mesmos que os>>> # nomes usados no mapper.>>> session.query(User).from_statement(\... "SELECT * FROM users where name=:name").\... params(name=’ed’).all()

[<User(’ed’,’Ed Jones’, ’f8s7ccs’)>]

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 51 / 72

Mao na massa Relacionamento

Roteiro

1 IntroducaoSobre o palestranteSobre a palestra

2 Framework SQLAlchemyConteudo

3 Mao na massaOs ingredientesPreparacaoUtilizacao da bibliotecaConsultandoOperadoresReceitas alternativasRelacionamento

4 Bibliografia

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 52 / 72

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 "<Address(’%s’)>" % self.email_address

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 53 / 72

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="user")

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 54 / 72

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

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

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

Mao na massa Relacionamento

Visibilidade nas duas direcoes

Relacionamentos bidirecionais sao visıveis nas duas direcoes

>>> # Usuario possui enderecos e enderecos sao de algum usuario.>>> 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

Mao na massa Relacionamento

”Commitando”

Salvando as informacoes no banco

>>> # Persistindo o novo usuario.>>> session.add(jack)>>> session.commit()

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 59 / 72

Mao na massa Relacionamento

Economia de recursos

As consultas ao banco sao feitas sob demanda

>>> # Ao selecionar o usuario, o SQL para os enderecos>>> # nao 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

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

Mao na massa Relacionamento

Economia de acessos

Se for o caso e possıvel buscar tudo antes.(eagerload)

>>> # Com eagerload os enderecos sao obtidos juntamente com o>>> # usuario.>>> 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

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

Mao na massa Relacionamento

Relacionando com join

Usando a funcao join()

>>> # Usando join com o metodo select_from.>>> 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

Mao na massa Relacionamento

Clausula ”on”

E possıvel indicar a clausula on do join

# condicao explicıtajoin(User, Address, User.id==Address.user_id)# Especifıca relacao da esquerda para direitajoin(User, Address, User.addresses)# o mesmo, usando uma stringjoin(User, Address, ’addresses’)

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 65 / 72

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

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

Mao na massa Relacionamento

Referencias

Python - http://www.python.orgPythonBrasil - http://www.pythonbrasil.com.brGruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPrSQLAlchemy - http://www.sqlalchemy.org

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72

Mao na massa Relacionamento

Referencias

Python - http://www.python.orgPythonBrasil - http://www.pythonbrasil.com.brGruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPrSQLAlchemy - http://www.sqlalchemy.org

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72

Mao na massa Relacionamento

Referencias

Python - http://www.python.orgPythonBrasil - http://www.pythonbrasil.com.brGruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPrSQLAlchemy - http://www.sqlalchemy.org

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72

Mao na massa Relacionamento

Referencias

Python - http://www.python.orgPythonBrasil - http://www.pythonbrasil.com.brGruPy-PR - http://www.pythonbrasil.com.br/moin.cgi/GrupyPrSQLAlchemy - http://www.sqlalchemy.org

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 68 / 72

Sumario

Sumario

IntroducaoSobre o palestranteSobre a palestra

Caracterısticas - SQLAlchemyUtilizacao

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72

Sumario

Sumario

IntroducaoSobre o palestranteSobre a palestra

Caracterısticas - SQLAlchemyUtilizacao

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72

Sumario

Sumario

IntroducaoSobre o palestranteSobre a palestra

Caracterısticas - SQLAlchemyUtilizacao

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72

Sumario

Sumario

IntroducaoSobre o palestranteSobre a palestra

Caracterısticas - SQLAlchemyUtilizacao

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72

Sumario

Sumario

IntroducaoSobre o palestranteSobre a palestra

Caracterısticas - SQLAlchemyUtilizacao

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 69 / 72

Bibliografia

Bibliografia

[1] SetupTools1.http://peak.telecommunity.com/DevCenter/setuptools, 3September 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

Bibliografia

Bibliografia

[1] SetupTools1.http://peak.telecommunity.com/DevCenter/setuptools, 3September 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

Bibliografia

Bibliografia

[1] SetupTools1.http://peak.telecommunity.com/DevCenter/setuptools, 3September 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

Bibliografia

Agradecimentos

ASCAM-PR, Associacao de Servidores de Camaras Municipaisda Parana.ABRASCAM, Associacao Brasileira de Servidores de CamarasMunicipais.Comunidade Python Brasil e APyBR, Associacao Python Brasil.Comunidade de Software Livre.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72

Bibliografia

Agradecimentos

ASCAM-PR, Associacao de Servidores de Camaras Municipaisda Parana.ABRASCAM, Associacao Brasileira de Servidores de CamarasMunicipais.Comunidade Python Brasil e APyBR, Associacao Python Brasil.Comunidade de Software Livre.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72

Bibliografia

Agradecimentos

ASCAM-PR, Associacao de Servidores de Camaras Municipaisda Parana.ABRASCAM, Associacao Brasileira de Servidores de CamarasMunicipais.Comunidade Python Brasil e APyBR, Associacao Python Brasil.Comunidade de Software Livre.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72

Bibliografia

Agradecimentos

ASCAM-PR, Associacao de Servidores de Camaras Municipaisda Parana.ABRASCAM, Associacao Brasileira de Servidores de CamarasMunicipais.Comunidade Python Brasil e APyBR, Associacao Python Brasil.Comunidade de Software Livre.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 71 / 72

Bibliografia

Conclusao

Python e uma linguagem muito bacana, facil de aprender, poderosa eprodutiva, aliada a gama de bibliotecas e frameworks torna-se hoje umconhecimento muito valioso, empresas como Nokia, Globo e Googleprocuram profissionais com esse conhecimento pelo mundo todo.Usar essa tecnologia para trabalhar com bancos de dados e bemtranquilo e possui inumeras opcoes.

Ramiro Batista da Luz (APyBR) SQLAlchemy - Python - ORM CONISLI 2008 72 / 72

Recommended