SlideShare une entreprise Scribd logo
1  sur  29
Python - Aula 4
                   Bruno Gama Catão
Bancos de Dados
DB-API

• Python Database API Specification;


• Módulos que integram Python a uma tecnologia de banco de dados devem
  implementar esta especificação;


• Conceitos:


  • Conexão: Canal de comunicação entre o SGBD e a aplicação;


  • Cursor: Objeto responsável por enviar comandos ao banco de dados.
DB-API

• Operações sobre conexões:


  • commit: persiste os dados de uma sessão no banco de dados;


  • rollback: descarta os valores da sessão;


• Operações sobre cursores:


  • execute: executa um comando no banco de dados;


  • fetchall: retorna todos os valores produzidos pelo comando executado;


  • fetchone: retorna apenas um valor;


  • fechsome: retorna no máximo o número especificado de valores.
SQLITE

• Já vem integrado com o Python a partir da versão 2.5;


• Acessível através da biblioteca sqlite3;


• Armazena os bancos de dados em arquivos;


• Compatível com o padrão SQL92;


• Suporta transações;


• Suporta bancos de dados de até 2 TB.
SQLITE

• Primeiro exemplo, Agenda (para variar ...);


• Criando um banco de dados:


• sqlite3 agenda.db                                       agenda
                                                ---------------------------
• Criando uma tabela:                                * id : INTEGER
                                                nome : VARCHAR(30)
 CREATE TABLE agenda (                            tel : VARCHAR(20)
 id INTEGER PRIMARY KEY,

 nome VARCHAR(30),

 tel VARCHAR(20));
SQLITE

• Inserindo dados:


  • INSERT INTO agenda(nome, tel) VALUES (‘Pedro’, ‘555-5555’);


  • INSERT INTO agenda(nome, tel) VALUES (‘Maria’, ‘333-3333’);


  • INSERT INTO agenda(nome, tel) VALUES (‘José’, ‘444-4444’);


  • INSERT INTO agenda(nome, tel) VALUES (‘Ana’, ‘666-6666’);


• Para encerrar o SQLITE pressione CONTROL+D;


• Verifique se o arquivo agenda.db foi criado.
Módulo SQLITE3

• Módulo compatível com a DB-API;


• Utilizando o módulo:


  • from sqlite3 import dbapi2 as sqlite


• Criando uma conexão:
                                            Atenção: O arquivo agenda.db
  • con = sqlite.connect('agenda.db')       deve estar no diretório corrente,
                                             caso contrário especifique o
                                           caminho completo para o arquivo.
• Obtendo um cursor:


  • cursor = con.cursor( )
Módulo SQLITE3

• Realizando uma consulta:


  • cursor.execute('select * from agenda')


• Obtendo os valores da consulta:


  • dados = cursor.fetchall( )


• O método fetchall retorna uma lista com todos os dados da consulta;


• Você pode preferir retornar um número menor de dados utilizando os
  métodos fetchone ou fetchsome.
Módulo SQLITE3

• Note que os dados retornados pelo fetchall são uma lista:

  • [(1, u'Escola Técnica Federal de Palmas', u'63-3225-1205'), (2, u'Aeroporto de Palmas',
    u'63-3219-3700'), (3, u'Água e Esgoto', u'0800-644-0195'), (4, u'Energia Elétrica',
    u'0800-646-4196'), (5, u'Disque-Denúncia', u'0800-63-1190'), (6, u'Polícia Civil',
    u'63-3218-5000'), (7, u'Prefeitura Municipal', u'63-3218-5000'), (8, u'Alcoólicos Anônimos',
    u'63-3215-4165')]


• Você pode acessar esses valores pelo índice:


  • Nome do primeiro registro: dados[0][1]


• Ou fazer algo com um jeito mais Python:
 cursor.execute('SELECT nome, tel FROM agenda ORDER BY nome')
 for nome, tel in cursor.fetchall():
     print nome, tel
Módulo SQLITE3

  • Para inserir, remover ou atualizar dados você deve utilizar uma transação;


  • Por exemplo:

# -*- coding: latin-1 -*-
from sqlite3 import dbapi2 as sqlite

#Abrindo uma conexão
con = sqlite.connect('agenda.db')
#Obtendo um cursor
cursor = con.cursor()
cursor.execute("INSERT INTO agenda(nome, tel) VALUES('Bruno', '123')")
#Salvando os dados da transação
con.commit()
Módulo SQLITE3

• Passando parâmetros;


  • É importante prestar atenção a forma como os parâmetros são passados
    para evitar ataques de SQL Injection no seu sistema;


• Forma errada:

  • cursor.execute('INSERT INTO agenda(nome,tel) VALUES (%s, %s)' % (nome, tel))


• Forma correta:


  • cursor.execute('INSERT INTO agenda(nome,tel) VALUES (?, ?)', (nome, tel))
Módulo SQLITE3




                                             - O nome dele        - Bem, nós perdemos o
Oi, aqui é a escola                      realmente é Robert’);     registro deste ano de
                         - Nossa, ele        DROP TABLE             todos os estudantes.
 do seu filho. Nós
                       quebrou algo ?         Students;--?        Espero que você esteja
estamos tendo um
                      - De certa forma       - É sim. Nós o                 feliz.
  problema com
                             sim.            chamados de          - E eu espero que você
  computadores.
                                            pequeno Bobby        tenha aprendido a tratar
                                                 Tables.           os dados de entrada.
# -*- coding: latin-1 -*-                                   Este é um
from sqlite3 import dbapi2 as sqlite                        programa
                                                            completo !
#Abrindo uma conexão
con = sqlite.connect('agenda.db')
#Obtendo um cursor
cursor = con.cursor()

while True:
    opcao = raw_input('Qual a sua opção (a)dicionar, (l)istar ou (s)air: ')
    if opcao == 'a':
        nome = raw_input('Digite o nome: ')
        tel = raw_input('Digite o telefone: ')
        cursor.execute('INSERT INTO agenda(nome,tel) VALUES (?, ?)', (nome, tel))
        con.commit()
    elif opcao == 'l':
        cursor.execute('SELECT nome, tel FROM agenda ORDER BY nome')
        for nome, tel in cursor.fetchall():
            print nome, tel
    elif opcao == 's':
        break
    else:
        print 'Digite uma opção válida !'
SQLAlchemy

• É uma biblioteca que facilita a utilização de bancos de dados por aplicações
  Python;


• O SQLAlchemy faz o mapeamento objecto-relacional entre os objetos Python
  a as tabelas de um banco de dados;


• SQLAlchemy é suporta qualquer banco de dados que possua módulo DB-
  API;


• A instalação do SQLAlchemy pode ser feita de duas formas:


  • Fazendo o download; http://www.sqlalchemy.org/


  • Utilizando o setuptools.
Setup Tools

• Objetivo: Instalação fácil de pacotes Python;


• Link para download:


   • http://pypi.python.org/pypi/setuptools/


• Instalação:


   • Windows:


      • Execute o arquivo setuptools-0.6c11.win32-py2.6.exe;


   • Linux e MacOS:


      • sudo sh setuptools-0.6c11-py2.6.egg
SQLAlchemy

• Instalação:


   • Windows:


      • easy_install SQLAlchemy


   • Linux e MacOS:


      • sudo easy_install SQLAlchemy
SQLAlchemy

• Conceitos básicos:


  • Você deve criar classes para mapear as tabelas do banco de dados;


  • As operações serão feitas apenas sobre as classes, não necessitando
    trabalhar com SQL;


  • A conexão ao banco de dados é feita através de uma engine;


  • As operações com o banco de dados são feitas em uma sessão;


  • Uma sessão define uma transação.
SQLAlchemy
• Mapeando uma classe em uma tabela:


  • É necessário criar uma classe para cada tabela que se queira mapear;


  • As próprias classes podem ser utilizadas para criar as tabelas, caso elas
    não existam;


• Forma geral:
           from sqlalchemy import *
           from sqlalchemy.ext.declarative import declarative_base

           Base = declarative_base()

           class Contato(Base):
               __tablename__ = 'agenda'        Atributo obrigatório

                 id   = Column(Integer, primary_key=True)
                 nome = Column(String)
                 tel = Column(String)
SQLAlchemy

• Toda classe mapeada é subclasse de declarative_base;

• No SQLAlchemy toda tabela/classe mapeada deve ter uma chave primária;

• Não é necessário criar um construtor para as classes mapeadas;

• Todas as colunas tem um tipo associado (Integer, String, Numeric, etc);

• Se você está utilizando o PostgreSQL ou o SQLite são há necessidade de
  especificar o tamanho das colunas, mas para os outros bancos é obrigatório
  indicar este tamanho:
           class Contato(Base):
               __tablename__ = 'agenda'

                id   = Column(Integer, primary_key=True)
                nome = Column(String(30))
                tel = Column(String(20))
SQLAlchemy

• Com exceção do Oracle e do Firebird, todos os outros bancos de dados têm
  suporte a colunas com auto incremento (para as chaves primárias);


• Para o Oracle e Firebird é necessário especificar uma seqüência:
class Contato(Base):
    __tablename__ = 'agenda'

    id   = Column(Integer, Sequence('contato_seq'), primary_key=True)
    nome = Column(String(30))
    tel = Column(String(20))
SQLAlchemy
                           Nome do SGBD
• Obtendo uma engine:

   • engine = create_engine('sqlite:///agenda.db')

                                    URL para o banco de dados


• O nome do SGBD é uma forma do SQLAlchemy localizar o módulo correto,
  alguns exemplos de nomes são: sqlite, mysql, postgresql, mssql, oracle, ...

• A URL para o banco de dados é dependente do módulo que se está
  utilizando, por isso, deve-se ler a documentação do módulo para saber como
  construir a URL;

• Exemplos: mssql://user:passwd@mydsn, oracle://scott:tiger@127.0.0.1:1521/
  sidname, mysql://scott:tiger@localhost/foo, ...

• Você pode, na criação, pedir que a engine mostre todos o código SQL
  gerado por ela: create_engine('sqlite:///agenda.db', echo=True)
SQLAlchemy

• Criando automaticamente as tabelas:


  • Para isto, após a definição do mapeamento, utiliza-se o atributo metadata
    da classe Base:

                  Base.metadata.create_all(engine)



• Obtendo uma sessão:


  • As sessões estão sempre associadas a uma engine:

                Session = sessionmaker(bind=engine)
                session = Session()
SQLAlchemy

• Gravando objetos no banco de dados:


   • session.add(objeto)


   • session.commit( )


• Você pode adicionar uma lista de objetos de uma vez só:


   • session.add_all([objeto1, objeto2, objeto3])


• Atenção: Lembre-se sempre de após um bloco de atualizações realizar o
  commit, pois, caso contrário, os dados não serão persistidos;


• Caso algum erro ocorra, você deve chamar o rollback, para deixar o estado do
  banco de dados igual ao do último commit realizado.
SQLAlchemy - Consultas

• Pela chave primária:

  • bruno = session.query(Contato).get(5)

• Retornando todos os registros:

  • contatos = session.query(Contato).all( )

• Ordenando os resultados:

  • contatos = session.query(Contato).order_by(Contato.nome).all( )

• Filtrando por um campo:

  • pedro = session.query(Contato).filter(nome=”Pedro”).first( )

• Restringindo os resultados:

  • Você pode usar o método all, para obter todos os resultados ou first para
    obter apenas o primeiro.
SQLAlchemy

• Para alterar um registro é preciso: obtê-lo na sessão, modificar seus valores e
  fazer commit da sessão:


              contato = session.query(Contato).get(5)
              contato.tel = '8888-8888'
              session.commit()


• Para remover um registro é preciso: obtê-lo, chamar o método delete na
  sessão e fazer commit:

              contato = session.query(Contato).get(5)
              session.delete(contato)
              session.commit()
SQLAlchemy

• Vamos reproduzir o nosso exemplo anterior criando um novo projeto do
  PyDev chamado Agenda;


• Este projeto será composto por dois módulos contato.py e principal.py;


• O módulo contato.py irá conter o mapeamento da classe Contato com a
  tabela agenda;


• O módulo principal.py terá o código do programa principal.
SQLAlchemy - Módulo contato.py

  from sqlalchemy import *
  from sqlalchemy.ext.declarative import declarative_base

  Base = declarative_base()

  class Contato(Base):
      __tablename__ = 'agenda'

      id   = Column(Integer, primary_key=True)
      nome = Column(String)
      tel = Column(String)

      def __init__(self, nome, tel):
              self.nome = nome
              self.tel = tel
SQLAlchemy - Módulo principal.py

• Apenas o cabeçalho e os imports:




                 # -*- coding: latin-1 -*-
                 from sqlalchemy import create_engine
                 from sqlalchemy.orm import sessionmaker
                 from contato import Contato, Base
                 import os




• Continua ...
engine = create_engine('sqlite:///agenda.db')
Session = sessionmaker(bind=engine)
session = Session()

if not os.path.exists('agenda.db'):
    Base.metadata.create_all(engine)

while True:
    opcao = raw_input('Qual a sua opção (a)dicionar, (l)istar ou (s)air: ')
    if opcao == 'a':
        nome = raw_input('Digite o nome: ')
        tel = raw_input('Digite o telefone: ')
        session.add(Contato(nome, tel))
        session.commit()
    elif opcao == 'l':
        for contato in session.query(Contato).order_by(Contato.nome):
            print contato.nome, contato.tel
    elif opcao == 's':
        break
    else:
        print 'Digite uma opção válida !'

Contenu connexe

Tendances

Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3Flávio Ribeiro
 
Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Luciano Ramalho
 
Java Básico - Resolução
Java Básico - ResoluçãoJava Básico - Resolução
Java Básico - ResoluçãoAndré Salla
 
Design de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelDesign de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelAndrews Medina
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaElaine Cecília Gatto
 
Palestra python
Palestra pythonPalestra python
Palestra pythonRony Cruch
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECLW3P Projetos Web
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn Leite
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 

Tendances (20)

Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3Implementação de Aplicações Móveis e Jogos com Python - Aula 3
Implementação de Aplicações Móveis e Jogos com Python - Aula 3
 
Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011Jython no JavaOne Latin America 2011
Jython no JavaOne Latin America 2011
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
PHP 7
PHP 7PHP 7
PHP 7
 
Java Básico - Resolução
Java Básico - ResoluçãoJava Básico - Resolução
Java Básico - Resolução
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
Javascript
JavascriptJavascript
Javascript
 
Design de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentávelDesign de código: princípios e práticas para ter um código sustentável
Design de código: princípios e práticas para ter um código sustentável
 
Programação Desktop: Revisão Core Java
Programação Desktop: Revisão Core JavaProgramação Desktop: Revisão Core Java
Programação Desktop: Revisão Core Java
 
Palestra python
Palestra pythonPalestra python
Palestra python
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECL
 
How stuff works
How stuff worksHow stuff works
How stuff works
 
Python
PythonPython
Python
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Acessando o MySql com o Python
Acessando o MySql com o PythonAcessando o MySql com o Python
Acessando o MySql com o Python
 
Cool 3 assembly para linux
Cool 3   assembly para linuxCool 3   assembly para linux
Cool 3 assembly para linux
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 

En vedette

SQLAlchemy - A magia do mapeamento objeto relacional.
SQLAlchemy - A magia do mapeamento objeto relacional.SQLAlchemy - A magia do mapeamento objeto relacional.
SQLAlchemy - A magia do mapeamento objeto relacional.Ramiro Luz
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose PigmentarBruno Catão
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e TkCarlos Campani
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolsoJean Lopes
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 

En vedette (14)

Web Offline
Web OfflineWeb Offline
Web Offline
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Python 07
Python 07Python 07
Python 07
 
SQLAlchemy - A magia do mapeamento objeto relacional.
SQLAlchemy - A magia do mapeamento objeto relacional.SQLAlchemy - A magia do mapeamento objeto relacional.
SQLAlchemy - A magia do mapeamento objeto relacional.
 
Python e bancos NoSQL
Python e bancos NoSQLPython e bancos NoSQL
Python e bancos NoSQL
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Python 06
Python 06Python 06
Python 06
 
Angular js
Angular jsAngular js
Angular js
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose Pigmentar
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e Tk
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolso
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 

Similaire à Python 04

Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01julianabdpaiva
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosLuis Borges Gouveia
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxAugustoNicolau2
 
Curso de Certificação Linux LPI - Terminal Root
Curso de Certificação Linux LPI - Terminal RootCurso de Certificação Linux LPI - Terminal Root
Curso de Certificação Linux LPI - Terminal RootMarcos Quinho
 
Artigo data warehouse bd ii - 2015-1
Artigo data warehouse   bd ii - 2015-1Artigo data warehouse   bd ii - 2015-1
Artigo data warehouse bd ii - 2015-1Darlene Coelho
 
Artigo data warehouse bd ii - 2015-1 a
Artigo data warehouse   bd ii - 2015-1 aArtigo data warehouse   bd ii - 2015-1 a
Artigo data warehouse bd ii - 2015-1 aDarlene Coelho
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Marco Pinheiro
 

Similaire à Python 04 (20)

Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01Livropythonmysql 091022073751-phpapp01
Livropythonmysql 091022073751-phpapp01
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
Bd sql (1)
Bd sql (1)Bd sql (1)
Bd sql (1)
 
Agbd aula4 sql_ddl
Agbd aula4 sql_ddlAgbd aula4 sql_ddl
Agbd aula4 sql_ddl
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
2006 - ADONET.ppt
2006 - ADONET.ppt2006 - ADONET.ppt
2006 - ADONET.ppt
 
Exemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dadosExemplo e caso prático do uso de base de dados
Exemplo e caso prático do uso de base de dados
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptx
 
Java13
Java13Java13
Java13
 
Apostila Oracle
Apostila OracleApostila Oracle
Apostila Oracle
 
Curso de Certificação Linux LPI - Terminal Root
Curso de Certificação Linux LPI - Terminal RootCurso de Certificação Linux LPI - Terminal Root
Curso de Certificação Linux LPI - Terminal Root
 
Ado.net.exmplos.praticos
Ado.net.exmplos.praticosAdo.net.exmplos.praticos
Ado.net.exmplos.praticos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Artigo data warehouse bd ii - 2015-1
Artigo data warehouse   bd ii - 2015-1Artigo data warehouse   bd ii - 2015-1
Artigo data warehouse bd ii - 2015-1
 
Artigo data warehouse bd ii - 2015-1 a
Artigo data warehouse   bd ii - 2015-1 aArtigo data warehouse   bd ii - 2015-1 a
Artigo data warehouse bd ii - 2015-1 a
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)
 

Plus de Bruno Catão

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Bruno Catão
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Bruno Catão
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2Bruno Catão
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1Bruno Catão
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Bruno Catão
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework GrailsBruno Catão
 
O framework spring
O framework springO framework spring
O framework springBruno Catão
 

Plus de Bruno Catão (12)

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1
 
Node JS - Parte 4
Node JS - Parte 4Node JS - Parte 4
Node JS - Parte 4
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
 
Node JS - Parte 2
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2
 
Node JS - Parte 1
Node JS - Parte 1Node JS - Parte 1
Node JS - Parte 1
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework Grails
 
O framework spring
O framework springO framework spring
O framework spring
 

Dernier

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 

Dernier (9)

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Python 04

  • 1. Python - Aula 4 Bruno Gama Catão Bancos de Dados
  • 2. DB-API • Python Database API Specification; • Módulos que integram Python a uma tecnologia de banco de dados devem implementar esta especificação; • Conceitos: • Conexão: Canal de comunicação entre o SGBD e a aplicação; • Cursor: Objeto responsável por enviar comandos ao banco de dados.
  • 3. DB-API • Operações sobre conexões: • commit: persiste os dados de uma sessão no banco de dados; • rollback: descarta os valores da sessão; • Operações sobre cursores: • execute: executa um comando no banco de dados; • fetchall: retorna todos os valores produzidos pelo comando executado; • fetchone: retorna apenas um valor; • fechsome: retorna no máximo o número especificado de valores.
  • 4. SQLITE • Já vem integrado com o Python a partir da versão 2.5; • Acessível através da biblioteca sqlite3; • Armazena os bancos de dados em arquivos; • Compatível com o padrão SQL92; • Suporta transações; • Suporta bancos de dados de até 2 TB.
  • 5. SQLITE • Primeiro exemplo, Agenda (para variar ...); • Criando um banco de dados: • sqlite3 agenda.db agenda --------------------------- • Criando uma tabela: * id : INTEGER nome : VARCHAR(30) CREATE TABLE agenda ( tel : VARCHAR(20) id INTEGER PRIMARY KEY, nome VARCHAR(30), tel VARCHAR(20));
  • 6. SQLITE • Inserindo dados: • INSERT INTO agenda(nome, tel) VALUES (‘Pedro’, ‘555-5555’); • INSERT INTO agenda(nome, tel) VALUES (‘Maria’, ‘333-3333’); • INSERT INTO agenda(nome, tel) VALUES (‘José’, ‘444-4444’); • INSERT INTO agenda(nome, tel) VALUES (‘Ana’, ‘666-6666’); • Para encerrar o SQLITE pressione CONTROL+D; • Verifique se o arquivo agenda.db foi criado.
  • 7. Módulo SQLITE3 • Módulo compatível com a DB-API; • Utilizando o módulo: • from sqlite3 import dbapi2 as sqlite • Criando uma conexão: Atenção: O arquivo agenda.db • con = sqlite.connect('agenda.db') deve estar no diretório corrente, caso contrário especifique o caminho completo para o arquivo. • Obtendo um cursor: • cursor = con.cursor( )
  • 8. Módulo SQLITE3 • Realizando uma consulta: • cursor.execute('select * from agenda') • Obtendo os valores da consulta: • dados = cursor.fetchall( ) • O método fetchall retorna uma lista com todos os dados da consulta; • Você pode preferir retornar um número menor de dados utilizando os métodos fetchone ou fetchsome.
  • 9. Módulo SQLITE3 • Note que os dados retornados pelo fetchall são uma lista: • [(1, u'Escola Técnica Federal de Palmas', u'63-3225-1205'), (2, u'Aeroporto de Palmas', u'63-3219-3700'), (3, u'Água e Esgoto', u'0800-644-0195'), (4, u'Energia Elétrica', u'0800-646-4196'), (5, u'Disque-Denúncia', u'0800-63-1190'), (6, u'Polícia Civil', u'63-3218-5000'), (7, u'Prefeitura Municipal', u'63-3218-5000'), (8, u'Alcoólicos Anônimos', u'63-3215-4165')] • Você pode acessar esses valores pelo índice: • Nome do primeiro registro: dados[0][1] • Ou fazer algo com um jeito mais Python: cursor.execute('SELECT nome, tel FROM agenda ORDER BY nome') for nome, tel in cursor.fetchall(): print nome, tel
  • 10. Módulo SQLITE3 • Para inserir, remover ou atualizar dados você deve utilizar uma transação; • Por exemplo: # -*- coding: latin-1 -*- from sqlite3 import dbapi2 as sqlite #Abrindo uma conexão con = sqlite.connect('agenda.db') #Obtendo um cursor cursor = con.cursor() cursor.execute("INSERT INTO agenda(nome, tel) VALUES('Bruno', '123')") #Salvando os dados da transação con.commit()
  • 11. Módulo SQLITE3 • Passando parâmetros; • É importante prestar atenção a forma como os parâmetros são passados para evitar ataques de SQL Injection no seu sistema; • Forma errada: • cursor.execute('INSERT INTO agenda(nome,tel) VALUES (%s, %s)' % (nome, tel)) • Forma correta: • cursor.execute('INSERT INTO agenda(nome,tel) VALUES (?, ?)', (nome, tel))
  • 12. Módulo SQLITE3 - O nome dele - Bem, nós perdemos o Oi, aqui é a escola realmente é Robert’); registro deste ano de - Nossa, ele DROP TABLE todos os estudantes. do seu filho. Nós quebrou algo ? Students;--? Espero que você esteja estamos tendo um - De certa forma - É sim. Nós o feliz. problema com sim. chamados de - E eu espero que você computadores. pequeno Bobby tenha aprendido a tratar Tables. os dados de entrada.
  • 13. # -*- coding: latin-1 -*- Este é um from sqlite3 import dbapi2 as sqlite programa completo ! #Abrindo uma conexão con = sqlite.connect('agenda.db') #Obtendo um cursor cursor = con.cursor() while True: opcao = raw_input('Qual a sua opção (a)dicionar, (l)istar ou (s)air: ') if opcao == 'a': nome = raw_input('Digite o nome: ') tel = raw_input('Digite o telefone: ') cursor.execute('INSERT INTO agenda(nome,tel) VALUES (?, ?)', (nome, tel)) con.commit() elif opcao == 'l': cursor.execute('SELECT nome, tel FROM agenda ORDER BY nome') for nome, tel in cursor.fetchall(): print nome, tel elif opcao == 's': break else: print 'Digite uma opção válida !'
  • 14. SQLAlchemy • É uma biblioteca que facilita a utilização de bancos de dados por aplicações Python; • O SQLAlchemy faz o mapeamento objecto-relacional entre os objetos Python a as tabelas de um banco de dados; • SQLAlchemy é suporta qualquer banco de dados que possua módulo DB- API; • A instalação do SQLAlchemy pode ser feita de duas formas: • Fazendo o download; http://www.sqlalchemy.org/ • Utilizando o setuptools.
  • 15. Setup Tools • Objetivo: Instalação fácil de pacotes Python; • Link para download: • http://pypi.python.org/pypi/setuptools/ • Instalação: • Windows: • Execute o arquivo setuptools-0.6c11.win32-py2.6.exe; • Linux e MacOS: • sudo sh setuptools-0.6c11-py2.6.egg
  • 16. SQLAlchemy • Instalação: • Windows: • easy_install SQLAlchemy • Linux e MacOS: • sudo easy_install SQLAlchemy
  • 17. SQLAlchemy • Conceitos básicos: • Você deve criar classes para mapear as tabelas do banco de dados; • As operações serão feitas apenas sobre as classes, não necessitando trabalhar com SQL; • A conexão ao banco de dados é feita através de uma engine; • As operações com o banco de dados são feitas em uma sessão; • Uma sessão define uma transação.
  • 18. SQLAlchemy • Mapeando uma classe em uma tabela: • É necessário criar uma classe para cada tabela que se queira mapear; • As próprias classes podem ser utilizadas para criar as tabelas, caso elas não existam; • Forma geral: from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Contato(Base): __tablename__ = 'agenda' Atributo obrigatório id = Column(Integer, primary_key=True) nome = Column(String) tel = Column(String)
  • 19. SQLAlchemy • Toda classe mapeada é subclasse de declarative_base; • No SQLAlchemy toda tabela/classe mapeada deve ter uma chave primária; • Não é necessário criar um construtor para as classes mapeadas; • Todas as colunas tem um tipo associado (Integer, String, Numeric, etc); • Se você está utilizando o PostgreSQL ou o SQLite são há necessidade de especificar o tamanho das colunas, mas para os outros bancos é obrigatório indicar este tamanho: class Contato(Base): __tablename__ = 'agenda' id = Column(Integer, primary_key=True) nome = Column(String(30)) tel = Column(String(20))
  • 20. SQLAlchemy • Com exceção do Oracle e do Firebird, todos os outros bancos de dados têm suporte a colunas com auto incremento (para as chaves primárias); • Para o Oracle e Firebird é necessário especificar uma seqüência: class Contato(Base): __tablename__ = 'agenda' id = Column(Integer, Sequence('contato_seq'), primary_key=True) nome = Column(String(30)) tel = Column(String(20))
  • 21. SQLAlchemy Nome do SGBD • Obtendo uma engine: • engine = create_engine('sqlite:///agenda.db') URL para o banco de dados • O nome do SGBD é uma forma do SQLAlchemy localizar o módulo correto, alguns exemplos de nomes são: sqlite, mysql, postgresql, mssql, oracle, ... • A URL para o banco de dados é dependente do módulo que se está utilizando, por isso, deve-se ler a documentação do módulo para saber como construir a URL; • Exemplos: mssql://user:passwd@mydsn, oracle://scott:tiger@127.0.0.1:1521/ sidname, mysql://scott:tiger@localhost/foo, ... • Você pode, na criação, pedir que a engine mostre todos o código SQL gerado por ela: create_engine('sqlite:///agenda.db', echo=True)
  • 22. SQLAlchemy • Criando automaticamente as tabelas: • Para isto, após a definição do mapeamento, utiliza-se o atributo metadata da classe Base: Base.metadata.create_all(engine) • Obtendo uma sessão: • As sessões estão sempre associadas a uma engine: Session = sessionmaker(bind=engine) session = Session()
  • 23. SQLAlchemy • Gravando objetos no banco de dados: • session.add(objeto) • session.commit( ) • Você pode adicionar uma lista de objetos de uma vez só: • session.add_all([objeto1, objeto2, objeto3]) • Atenção: Lembre-se sempre de após um bloco de atualizações realizar o commit, pois, caso contrário, os dados não serão persistidos; • Caso algum erro ocorra, você deve chamar o rollback, para deixar o estado do banco de dados igual ao do último commit realizado.
  • 24. SQLAlchemy - Consultas • Pela chave primária: • bruno = session.query(Contato).get(5) • Retornando todos os registros: • contatos = session.query(Contato).all( ) • Ordenando os resultados: • contatos = session.query(Contato).order_by(Contato.nome).all( ) • Filtrando por um campo: • pedro = session.query(Contato).filter(nome=”Pedro”).first( ) • Restringindo os resultados: • Você pode usar o método all, para obter todos os resultados ou first para obter apenas o primeiro.
  • 25. SQLAlchemy • Para alterar um registro é preciso: obtê-lo na sessão, modificar seus valores e fazer commit da sessão: contato = session.query(Contato).get(5) contato.tel = '8888-8888' session.commit() • Para remover um registro é preciso: obtê-lo, chamar o método delete na sessão e fazer commit: contato = session.query(Contato).get(5) session.delete(contato) session.commit()
  • 26. SQLAlchemy • Vamos reproduzir o nosso exemplo anterior criando um novo projeto do PyDev chamado Agenda; • Este projeto será composto por dois módulos contato.py e principal.py; • O módulo contato.py irá conter o mapeamento da classe Contato com a tabela agenda; • O módulo principal.py terá o código do programa principal.
  • 27. SQLAlchemy - Módulo contato.py from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Contato(Base): __tablename__ = 'agenda' id = Column(Integer, primary_key=True) nome = Column(String) tel = Column(String) def __init__(self, nome, tel): self.nome = nome self.tel = tel
  • 28. SQLAlchemy - Módulo principal.py • Apenas o cabeçalho e os imports: # -*- coding: latin-1 -*- from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from contato import Contato, Base import os • Continua ...
  • 29. engine = create_engine('sqlite:///agenda.db') Session = sessionmaker(bind=engine) session = Session() if not os.path.exists('agenda.db'): Base.metadata.create_all(engine) while True: opcao = raw_input('Qual a sua opção (a)dicionar, (l)istar ou (s)air: ') if opcao == 'a': nome = raw_input('Digite o nome: ') tel = raw_input('Digite o telefone: ') session.add(Contato(nome, tel)) session.commit() elif opcao == 'l': for contato in session.query(Contato).order_by(Contato.nome): print contato.nome, contato.tel elif opcao == 's': break else: print 'Digite uma opção válida !'

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n