From 3fa461717c6f1b4b3f5b44b01913f5f4234e306f Mon Sep 17 00:00:00 2001 From: rg3915 Date: Sun, 23 Nov 2014 00:53:48 -0200 Subject: [PATCH 1/3] python + sqlite pt 2 --- ...ando-banco-dados-sqlite3-python-parte2.rst | 1228 +++++++++++++++++ content/images/regisdasilva/tabelas.jpg | Bin 0 -> 85033 bytes 2 files changed, 1228 insertions(+) create mode 100644 content/gerenciando-banco-dados-sqlite3-python-parte2.rst create mode 100644 content/images/regisdasilva/tabelas.jpg diff --git a/content/gerenciando-banco-dados-sqlite3-python-parte2.rst b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst new file mode 100644 index 000000000..8a5d83072 --- /dev/null +++ b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst @@ -0,0 +1,1228 @@ +Gerenciando banco de dados SQLite3 com Python - Parte 2 +======================================================= + +:date: 2014-10-05 23:59 +:tags: Python, Banco de dados +:category: Python, Banco de dados +:slug: gerenciando-banco-dados-sqlite3-python-parte2 +:author: Regis da Silva +:email: regis.santos.100@gmail.com +:github: rg3915 +:summary: Esta é a continuação do artigo Gerenciando banco de dados SQLite3 com Python - Parte 1. + +Esta é a continuação do artigo `Gerenciando banco de dados SQLite3 com Python - Parte 1 `_. Na 1ª parte nós vimos como realizar o CRUD num banco de dados SQLite3 usando o Python, mas cada tarefa foi feita num arquivo ``.py`` separado. A intenção agora é utilizar um **único arquivo** e, usando classes e métodos realizar as mesmas tarefas, só que de uma forma mais sofisticada. + + PS: *Considere a sintaxe para Python 3*. Mas o programa roda em python2 também. + +Vou repetir a tabela ``clientes`` apenas por comodidade: + ++-----------+-----------------+-----------+ +| Campo | Tipo | Requerido | ++===========+=================+===========+ +| id | inteiro | sim | ++-----------+-----------------+-----------+ +| nome | texto | sim | ++-----------+-----------------+-----------+ +| idade | inteiro | não | ++-----------+-----------------+-----------+ +| cpf | texto (11) | sim | ++-----------+-----------------+-----------+ +| email | texto | sim | ++-----------+-----------------+-----------+ +| fone | texto | não | ++-----------+-----------------+-----------+ +| cidade | texto | não | ++-----------+-----------------+-----------+ +| uf | texto (2) | sim | ++-----------+-----------------+-----------+ +| criado_em | data | sim | ++-----------+-----------------+-----------+ +| bloqueado | boleano | não | ++-----------+-----------------+-----------+ + +Obs: O campo ``bloqueado`` nós vamos inserir depois com o comando ``ALTER TABLE``. + +.. Assista os videos no `youtube `_ . + +Veja os exemplos em `github `_. + +`Preparando o terreno`_ + +`Configurando um VirtualEnv para Python 3`_ + +`Criando valores randômicos`_ + +`Conectando e desconectando do banco`_ + +`Modo interativo`_ + +`Criando um banco de dados`_ + +`Criando uma tabela`_ + +`Create - Inserindo um registro com comando SQL`_ + +`Inserindo n registros com uma lista de dados`_ + +`Inserindo registros de um arquivo externo`_ + +`Importando dados de um arquivo csv`_ + +`Inserindo um registro com parâmetros de entrada definido pelo usuário`_ + +`Inserindo valores randômicos`_ + +`Read - Lendo os dados`_ + +`Mais SELECT`_ + +`SELECT personalizado`_ + +`Update - Alterando os dados`_ + +`Delete - Deletando os dados`_ + +`Adicionando uma nova coluna`_ + +`Lendo as informações do banco de dados`_ + +`Fazendo backup do banco de dados (exportando dados)`_ + +`Recuperando o banco de dados (importando dados)`_ + +`Conectando-se a outro banco`_ + +`Exemplos`_ + +`Referências`_ + +Preparando o terreno +-------------------- + +Neste artigo eu usei os pacotes `names `_ e `rstr `_ , o primeiro gera nomes randômicos e o segundo gera string e números randômicos. No meu SO estou usando o Python 3.4, mas para não ter problemas com os pacotes eu criei um ambiente virtual. + +**Obs**: *Se você estiver usando Python 3 ou Python 2x não é obrigado a usar virtualenv mas mesmo assim precisará instalar os pacotes names e rstr.* + +Configurando um VirtualEnv para Python 3 +---------------------------------------- + +Não é obrigatório, mas como eu tenho no meu SO o Python 3.4, tive que criar um virtualenv, que se configura da seguinte forma: + +Faça um clone deste repositório + +.. code-block:: bash + + $ git clone git@github.com:rg3915/python-sqlite.git + +Crie o virtualenv com o nome **python-sqlite** + +.. code-block:: bash + + $ virtualenv python-sqlite + +Habilite o python3 + +.. code-block:: bash + + $ virtualenv -p /usr/bin/python3 python-sqlite + +Vá para a pasta + +.. code-block:: bash + + $ cd python-sqlite + +Ative o ambiente + +.. code-block:: bash + + $ source bin/activate + +Seu prompt ficará assim (ou parecido) + +.. code-block:: bash + + (python-sqlite)~/git/python-sqlite$ + +Instale as dependências + +.. code-block:: bash + + $ pip install -r requirements.txt + +Entre na pasta + +.. code-block:: bash + + $ cd intermediario + +Agora vamos diminuir o caminho do prompt + +.. code-block:: bash + + PS1="(`basename \"$VIRTUAL_ENV\"`):/\W$ " + +O prompt vai ficar assim: + +.. code-block:: bash + + (python-sqlite):/intermediario$ + +Pronto! Agora vai começar a brincadeira. + +Criando valores randômicos +-------------------------- + +Antes de mexer no banco de fato vamos criar uns valores randômicos para popular o banco futuramente. + +O arquivo `gen_random_values.py `_ gera idade, cpf, telefone, data e cidade aleatoriamente. Para isso vamos importar algumas bibliotecas. + +.. code-block:: python + + # gen_random_values.py + import random + import rstr + import datetime + +Vamos criar uma função ``gen_age()`` para gerar um número inteiro entre 15 e 99 usando o comando `random.randint(a,b) `_ . + +.. code-block:: python + + def gen_age(): + return random.randint(15, 99) + +A função ``gen_cpf()`` gera uma string com 11 caracteres numéricos. No caso, o primeiro parâmetro são os caracteres que serão sorteados e o segundo é o tamanho da string. + +.. code-block:: python + + def gen_cpf(): + return rstr.rstr('1234567890', 11) + +Agora vamos gerar um telefone com a função ``gen_phone()`` no formato (xx) xxxx-xxxx + +.. code-block:: python + + def gen_phone(): + return '({0}) {1}-{2}'.format( + rstr.rstr('1234567890', 2), + rstr.rstr('1234567890', 4), + rstr.rstr('1234567890', 4)) + +A função ``gen_timestamp()`` gera um *datetime* no formato ``yyyy-mm-dd hh:mm:ss.000000``. Repare no uso do ``random.randint(a,b)`` com um intervalo definido para cada parâmetro. + +Quando usamos o comando `datetime.datetime.now().isoformat() `_ ele retorna a data e hora atual no formato ``yyyy-mm-ddThh:mm:ss.000000``. Para suprimir a letra T usamos o comando ``.isoformat(" ")`` que insere um espaço no lugar da letra T. + +.. code-block:: python + + def gen_timestamp(): + year = random.randint(1980, 2015) + month = random.randint(1, 12) + day = random.randint(1, 28) + hour = random.randint(1, 23) + minute = random.randint(1, 59) + second = random.randint(1, 59) + microsecond = random.randint(1, 999999) + date = datetime.datetime( + year, month, day, hour, minute, second, microsecond).isoformat(" ") + return date + +A função ``gen_city()`` escolhe uma cidade numa lista com o comando `random.choice(seq) `_ (suprimi alguns valores). + +.. code-block:: python + + def gen_city(): + list_city = [ + [u'São Paulo', 'SP'], + [u'Rio de Janeiro', 'RJ'], + [u'Porto Alegre', 'RS'], + [u'Campo Grande', 'MS']] + return random.choice(list_city) + + +Conectando e desconectando do banco +----------------------------------- + +Como mencionado antes, a intenção é criar um único arquivo. Mas, inicialmente, vamos usar um arquivo exclusivo para conexão o qual chamaremos de `connect_db.py `_ , assim teremos um arquivo que pode ser usado para vários testes de conexão com o banco de dados. + +.. code-block:: python + + # connect_db.py + import sqlite3 + + class Connect(object): + + def __init__(self, db_name): + try: + # conectando... + self.conn = sqlite3.connect(db_name) + self.cursor = self.conn.cursor() + # imprimindo nome do banco + print("Banco:", db_name) + # lendo a versão do SQLite + self.cursor.execute('SELECT SQLITE_VERSION()') + self.data = self.cursor.fetchone() + # imprimindo a versão do SQLite + print("SQLite version: %s" % self.data) + except sqlite3.Error: + print("Erro ao abrir banco.") + return False + +Aqui usamos o básico já visto na `parte 1 `_ que são os comandos ``sqlite3.connect()`` e ``cursor()``. Criamos uma classe "genérica" chamada ``Connect()`` que representa o banco de dados. E no inicializador da classe ``__init__`` fazemos a conexão com o banco e imprimimos a versão do SQLite, definido em ``self.cursor.execute('SELECT SQLITE_VERSION()')``. + +O próximo passo é fechar a conexão com o banco: + +.. code-block:: python + + def close_db(self): + if self.conn: + self.conn.close() + print("Conexão fechada.") + +Este método está dentro da classe ``Connect()``, portanto atente-se a **identação**. + +Agora, criamos uma instância da classe acima e chamamos de ``ClientesDb()``, representando um banco chamado *clientes.db*. + +.. code-block:: python + + class ClientesDb(object): + + def __init__(self): + self.db = Connect('clientes.db') + + def close_connection(self): + self.db.close_db() + +Fazendo desta forma é possível instanciar outras classes, uma para cada banco, como ``PessoasDb()`` que veremos mais pra frente. + +Finalmente, para rodar o programa podemos escrever o código abaixo... + +.. code-block:: python + + if __name__ == '__main__': + cliente = ClientesDb() + cliente.close_connection() + +salvar... e no terminal digitar: + +.. code-block:: bash + + $ python3 connect_db.py + $ ls *.db + +Pronto, o banco *clientes.db* está criado. + +Modo interativo +--------------- + +Legal mesmo é quando usamos o modo interativo para rodar os comandos do python, para isso podemos usar o python3 ou `ipython3 `_. No terminal basta digitar python3 ``ENTER`` que vai aparecer o prompt abaixo (*na mesma pasta do projeto, tá?*) + +.. code-block:: bash + + $ python3 + Python 3.4.0 (default, Apr 11 2014, 13:05:18) + [GCC 4.8.2] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> + +Agora vamos digitar os seguintes comandos, e depois eu explico tudo. + +.. code-block:: python + + >>> from connect_db import Connect + >>> dir(Connect) + >>> db = Connect('clientes.db') + >>> dir(db) + >>> db.close_db() + >>> exit() + +A primeira linha importa a classe ``Connect`` do arquivo *connect_db.py*. + +O comando ``dir(Connect)`` lista todos os métodos da classe ``Connect()``, inclusive ``__init__`` e ``close_db()``. + +``db = Connect('clientes.db')`` cria uma instância da classe ``Connect()`` e usa o argumento ``'clientes.db'`` para criar o banco com o nome especificado. + +o comando ``dir(db)`` lista os métodos da instância. + +E ``db.close_db()`` fecha a conexão com o banco. + + +Criando um banco de dados +------------------------- + +Nosso arquivo principal se chamará `manager_db.py `_ e iremos incrementá-lo aos poucos. Na verdade quando usamos o comando ``c = ClientesDb()`` já criamos o banco de dados com o nome especificado, e instanciamos uma classe chamada ``ClientesDb``. Portanto esta fase já está concluida. + +Mas vou repetir o código inicial para criar e conectar o banco de dados: + +.. code-block:: python + + # manager_db.py + import os + import sqlite3 + import io + import datetime + import names + import csv + from gen_random_values import * + + + class Connect(object): + + def __init__(self, db_name): + try: + # conectando... + self.conn = sqlite3.connect(db_name) + self.cursor = self.conn.cursor() + print("Banco:", db_name) + self.cursor.execute('SELECT SQLITE_VERSION()') + self.data = self.cursor.fetchone() + print("SQLite version: %s" % self.data) + except sqlite3.Error: + print("Erro ao abrir banco.") + return False + + def commit_db(self): + if self.conn: + self.conn.commit() + + def close_db(self): + if self.conn: + self.conn.close() + print("Conexão fechada.") + + + class ClientesDb(object): + + tb_name = 'clientes' + + def __init__(self): + self.db = Connect('clientes.db') + self.tb_name + + def fechar_conexao(self): + self.db.close_db() + + if __name__ == '__main__': + c = ClientesDb() + +Rodando no **terminal**... + +.. code-block:: bash + + $ python3 manager_db.py + $ ls *.db + +O banco ``clientes.db`` está criado. + +Ou no **modo interativo**... + +.. code-block:: python + + $ python3 + >>> from manager_db import * + >>> c = ClientesDb() + Banco: clientes.db + SQLite version: 3.8.2 + >>> exit() + + +Criando uma tabela +------------------ + +Agora é tudo continuação do arquivo `manager_db.py `_ ... + +.. code-block:: python + + def criar_schema(self, schema_name='sql/clientes_schema.sql'): + print("Criando tabela %s ..." % self.tb_name) + + try: + with open(schema_name, 'rt') as f: + schema = f.read() + self.db.cursor.executescript(schema) + except sqlite3.Error: + print("Aviso: A tabela %s já existe." % self.tb_name) + return False + + print("Tabela %s criada com sucesso." % self.tb_name) + + ... + + if __name__ == '__main__': + c = ClientesDb() + c.criar_schema() + +Aqui nós criamos a função ``criar_schema(self, schema_name)`` dentro da classe ``ClientesDb()``. + +Com ``with open(name)`` abrimos o arquivo `clientes_schema.sql `_ . + +Com ``f.read()`` lemos as linhas do arquivo. + +E com `cursor.executescript() `_ executamos a instrução sql que está dentro do arquivo. + +**Modo interativo**... + +.. code-block:: python + + $ python3 + >>> from manager_db import * + >>> c = ClientesDb() + >>> c.criar_schema() + Criando tabela clientes ... + Tabela clientes criada com sucesso. + +Se você digitar no terminal... + +.. code-block:: bash + + $ sqlite3 clientes.db .tables + +Você verá que a tabela foi criada com sucesso. + + + +Create - Inserindo um registro com comando SQL +---------------------------------------------- + +A função a seguir insere um registro na tabela. Repare no uso do comando ``self.db.commit_db()`` que grava de fato os dados. + +.. code-block:: python + + def inserir_um_registro(self): + try: + self.db.cursor.execute(""" + INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em) + VALUES ('Regis da Silva', 35, '12345678901', 'regis@email.com', '(11) 9876-5342', + 'São Paulo', 'SP', '2014-07-30 11:23:00.199000') + """) + # gravando no bd + self.db.commit_db() + print("Um registro inserido com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + + ... + + if __name__ == '__main__': + c = ClientesDb() + c.criar_schema() + c.inserir_um_registro() + + +Inserindo n registros com uma lista de dados +-------------------------------------------- + +A função a seguir insere vários registros a partir de uma lista. Repare no uso do comando `executemany(sql, [parâmetros]) `_ + +.. code-block:: python + + self.db.cursor.executemany("""INSERT INTO tabela (campos) VALUES (?)""", lista) + +que executa a instrução sql várias vezes. Note também, pela sintaxe, que a quantidade de ``?`` deve ser igual a quantidade de campos, e o parâmetro, no caso está sendo a lista criada. + +.. code-block:: python + + def inserir_com_lista(self): + # criando uma lista de dados + lista = [('Agenor de Sousa', 23, '12345678901', 'agenor@email.com', + '(10) 8300-0000', 'Salvador', 'BA', '2014-07-29 11:23:01.199001'), + ('Bianca Antunes', 21, '12345678902', 'bianca@email.com', + '(10) 8350-0001', 'Fortaleza', 'CE', '2014-07-28 11:23:02.199002'), + ('Carla Ribeiro', 30, '12345678903', 'carla@email.com', + '(10) 8377-0002', 'Campinas', 'SP', '2014-07-28 11:23:03.199003'), + ('Fabiana de Almeida', 25, '12345678904', 'fabiana@email.com', + '(10) 8388-0003', 'São Paulo', 'SP', '2014-07-29 11:23:04.199004'), + ] + try: + self.db.cursor.executemany(""" + INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em) + VALUES (?,?,?,?,?,?,?,?) + """, lista) + # gravando no bd + self.db.commit_db() + print("Dados inseridos da lista com sucesso: %s registros." % + len(lista)) + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + + + +Inserindo registros de um arquivo externo +----------------------------------------- + +Também podemos escrever as instruções sql num arquivo externo (`clientes_dados.sql `_) e executá-lo com o comando ``executescript(sql_script)``. Note que as instruções a seguir já foram vistas anteriormente. + +.. code-block:: python + + def inserir_de_arquivo(self): + try: + with open('sql/clientes_dados.sql', 'rt') as f: + dados = f.read() + self.db.cursor.executescript(dados) + # gravando no bd + self.db.commit_db() + print("Dados inseridos do arquivo com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + +Importando dados de um arquivo csv +---------------------------------- + +Agora vamos importar os dados de `clientes.csv `_ . A única novidade é o comando `csv.reader() `_ . + +.. code-block:: python + + import csv + ... + + def inserir_de_csv(self, file_name='csv/clientes.csv'): + try: + reader = csv.reader( + open(file_name, 'rt'), delimiter=',') + linha = (reader,) + for linha in reader: + self.db.cursor.execute(""" + INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em) + VALUES (?,?,?,?,?,?,?,?) + """, linha) + # gravando no bd + self.db.commit_db() + print("Dados importados do csv com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + +**Obs**: Veja em `gen_csv.py `_ como podemos gerar dados randômicos para criar um novo `clientes.csv `_s. + +Inserindo um registro com parâmetros de entrada definido pelo usuário +--------------------------------------------------------------------- + +Agora está começando a ficar mais interessante. Quando falamos *parâmetros de entrada* significa interação direta do usuário na aplicação. Ou seja, vamos inserir os dados diretamente pelo terminal em tempo de execução. Para isso nós usamos o comando ``input()`` para Python 3 ou ``raw_input()`` para Python 2. + +.. code-block:: python + + def inserir_com_parametros(self): + # solicitando os dados ao usuário + self.nome = input('Nome: ') + self.idade = input('Idade: ') + self.cpf = input('CPF: ') + self.email = input('Email: ') + self.fone = input('Fone: ') + self.cidade = input('Cidade: ') + self.uf = input('UF: ') or 'SP' + date = datetime.datetime.now().isoformat(" ") + self.criado_em = input('Criado em (%s): ' % date) or date + + try: + self.db.cursor.execute(""" + INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em) + VALUES (?,?,?,?,?,?,?,?) + """, (self.nome, self.idade, self.cpf, self.email, self.fone, + self.cidade, self.uf, self.criado_em)) + # gravando no bd + self.db.commit_db() + print("Dados inseridos com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + +Note que, em ``criado_em`` se você não informar uma data ele insere a data atual. E os parâmetros informados são passados no final do comando ``execute()``. + +Veja a interação: + +.. code-block:: python + + $ python3 + >>> from manager_db import * + >>> c = ClientesDb() + >>> c.criar_schema() + >>> c.inserir_com_parametros() + Nome: Regis + Idade: 35 + CPF: 11100011100 + Email: regis@email.com + Fone: (11) 1111-1111 + Cidade: São Paulo + UF: SP + Criado em (2014-10-07 01:40:48.836683): + Dados inseridos com sucesso. + + +Inserindo valores randômicos +---------------------------- + +Se lembra de `gen_random_values.py `_? Agora vamos usar ele. + +Para preencher *criado_em* usamos a data atual ``.now()``. + +Para gerar o *nome* usamos a função ``names.get_first_name()`` e ``names.get_last_name()``. + +Para o *email* pegamos a primeira letra do nome e o sobrenome + ``@email.com``, ou seja, o formato r.silva@email.com, por exemplo. + +Para a *cidade* e *uf* usamos a função ``gen_city()`` retornando os dois elementos de ``list_city``. + +O ``repeat`` é 10 por padrão, mas você pode mudar, exemplo ``inserir_randomico(15)`` na chamada da função. + +.. code-block:: python + + def inserir_randomico(self, repeat=10): + ''' Inserir registros com valores randomicos names ''' + lista = [] + for _ in range(repeat): + date = datetime.datetime.now().isoformat(" ") + fname = names.get_first_name() + lname = names.get_last_name() + name = fname + ' ' + lname + email = fname[0].lower() + '.' + lname.lower() + '@email.com' + c = gen_city() + city = c[0] + uf = c[1] + lista.append((name, gen_age(), gen_cpf(), + email, gen_phone(), + city, uf, date)) + try: + self.db.cursor.executemany(""" + INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em) + VALUES (?,?,?,?,?,?,?,?) + """, lista) + self.db.commit_db() + print("Inserindo %s registros na tabela..." % repeat) + print("Registros criados com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + + + +Read - Lendo os dados +--------------------- + +Eu preferi fazer duas funções ``ler_todos_clientes()`` e ``imprimir_todos_clientes()``. A primeira apenas retorna os valores com o comando ``fetchall()``, pois eu irei usá-lo mais vezes. E a segunda imprime os valores na tela. No caso, eu usei uma tabulação mais bonitinha... + +.. code-block:: python + + def ler_todos_clientes(self): + sql = 'SELECT * FROM clientes ORDER BY nome' + r = self.db.cursor.execute(sql) + return r.fetchall() + + def imprimir_todos_clientes(self): + lista = self.ler_todos_clientes() + print('{:>3s} {:20s} {:<5s} {:15s} {:21s} {:14s} {:15s} {:s} {:s}'.format( + 'id', 'nome', 'idade', 'cpf', 'email', 'fone', 'cidade', 'uf', 'criado_em')) + for c in lista: + print('{:3d} {:23s} {:2d} {:s} {:>25s} {:s} {:15s} {:s} {:s}'.format( + c[0], c[1], c[2], + c[3], c[4], c[5], + c[6], c[7], c[8])) + +mas se quiser você pode usar simplesmente + +.. code-block:: python + + def imprimir_todos_clientes(self): + lista = self.ler_todos_clientes() + for c in lista: + print(c) + +Mais SELECT +----------- + +**Exemplo**: Vamos explorar um pouco mais o ``SELECT``. Veja a seguir como localizar um cliente pelo ``id``. Uma *sutileza* é a vírgula logo depois do ``id``, isto é necessário porque quando usamos a ``?`` é esperado que os parâmetros sejam uma tupla. + +.. code-block:: python + + def localizar_cliente(self, id): + r = self.db.cursor.execute( + 'SELECT * FROM clientes WHERE id = ?', (id,)) + return r.fetchone() + + def imprimir_cliente(self, id): + if self.localizar_cliente(id) == None: + print('Não existe cliente com o id informado.') + else: + print(self.localizar_cliente(id)) + +O ``fetchone()`` retorna apenas uma linha de registro. + + +**Exemplo**: Veja um exemplo de como contar os registros. + +.. code-block:: python + + def contar_cliente(self): + r = self.db.cursor.execute( + 'SELECT COUNT(*) FROM clientes') + print("Total de clientes:", r.fetchone()[0]) + + +**Exemplo**: Contar os clientes maiores que 50 anos de idade. Veja novamente a necessidade da vírgula em ``(t,)``. + +.. code-block:: python + + def contar_cliente_por_idade(self, t=50): + r = self.db.cursor.execute( + 'SELECT COUNT(*) FROM clientes WHERE idade > ?', (t,)) + print("Clientes maiores que", t, "anos:", r.fetchone()[0]) + +Caso queira outra idade mude o valor ao chamar a função: + +.. code-block:: python + + c.contar_cliente_por_idade(18) + + +**Exemplo**: Localizar clientes por idade. + +.. code-block:: python + + def localizar_cliente_por_idade(self, t=50): + resultado = self.db.cursor.execute( + 'SELECT * FROM clientes WHERE idade > ?', (t,)) + print("Clientes maiores que", t, "anos:") + for cliente in resultado.fetchall(): + print(cliente) + + +**Exemplo**: Localizar clientes por uf. + +.. code-block:: python + + def localizar_cliente_por_uf(self, t='SP'): + resultado = self.db.cursor.execute( + 'SELECT * FROM clientes WHERE uf = ?', (t,)) + print("Clientes do estado de", t, ":") + for cliente in resultado.fetchall(): + print(cliente) + + +SELECT personalizado +-------------------- + +**Exemplo**: Vejamos agora como fazer nosso próprio ``SELECT``. + +.. code-block:: python + + def meu_select(self, sql="SELECT * FROM clientes WHERE uf='RJ';"): + r = self.db.cursor.execute(sql) + # gravando no bd + self.db.commit_db() + for cliente in r.fetchall(): + print(cliente) + +Assim, podemos escrever qualquer ``SELECT`` direto na chamada da função: + +.. code-block:: python + + c.meu_select("SELECT * FROM clientes WHERE uf='MG' ORDER BY nome;") + +Acabamos de mudar a função original. Eu coloquei o ``commit_db()`` porque se quiser você pode escrever uma instrução SQL com ``INSERT`` ou ``UPDATE``, por exemplo. + + +**Exemplo**: Lendo instruções de arquivos externos + +No arquivo `clientes_sp.sql `_ eu escrevi várias instruções SQL. + +.. code-block:: sql + + SELECT * FROM clientes WHERE uf='SP'; + SELECT COUNT(*) FROM clientes WHERE uf='SP'; + SELECT * FROM clientes WHERE uf='RJ'; + SELECT COUNT(*) FROM clientes WHERE uf='RJ'; + +Para que todas as instruções sejam lidas e retorne valores é necessário que usemos os comandos ``split(';')`` para informar ao interpretador qual é o final de cada linha. E o comando ``execute()`` dentro de um ``for``, assim ele lê e executa todas as instruções SQL do arquivo. + +.. code-block:: python + + def ler_arquivo(self, file_name='sql/clientes_sp.sql'): + with open(file_name, 'rt') as f: + dados = f.read() + sqlcomandos = dados.split(';') + print("Consulta feita a partir de arquivo externo.") + for comando in sqlcomandos: + r = self.db.cursor.execute(comando) + for c in r.fetchall(): + print(c) + # gravando no bd + self.db.commit_db() + +Novamente você pode usar qualquer instrução SQL porque o ``commit_db()`` já está ai. + +.. code-block:: python + + c.ler_arquivo('sql/`clientes_maior60.sql `_') + + +Update - Alterando os dados +--------------------------- + +Nenhuma novidade, todos os comandos já foram vistos antes. No caso, informamos o ``id`` do cliente. Veja que aqui usamos novamente a função ``localizar_cliente(id)`` para localizar o cliente. + +.. code-block:: python + + def atualizar(self, id): + try: + c = self.localizar_cliente(id) + if c: + # solicitando os dados ao usuário + # se for no python2.x digite entre aspas simples + self.novo_fone = input('Fone: ') + self.db.cursor.execute(""" + UPDATE clientes + SET fone = ? + WHERE id = ? + """, (self.novo_fone, id,)) + # gravando no bd + self.db.commit_db() + print("Dados atualizados com sucesso.") + else: + print('Não existe cliente com o id informado.') + except e: + raise e + +Chamando a função: + +.. code-block:: python + + c.atualizar(10) + + +Delete - Deletando os dados +--------------------------- + +Novamente vamos localizar o cliente para depois deletá-lo. + +.. code-block:: python + + def deletar(self, id): + try: + c = self.localizar_cliente(id) + # verificando se existe cliente com o ID passado, caso exista + if c: + self.db.cursor.execute(""" + DELETE FROM clientes WHERE id = ? + """, (id,)) + # gravando no bd + self.db.commit_db() + print("Registro %d excluído com sucesso." % id) + else: + print('Não existe cliente com o código informado.') + except e: + raise e + +Chamando a função: + +.. code-block:: python + + c.deletar(10) + + +Adicionando uma nova coluna +--------------------------- + +Para adicionar uma nova coluna é bem simples. + +.. code-block:: python + + def alterar_tabela(self): + try: + self.db.cursor.execute(""" + ALTER TABLE clientes + ADD COLUMN bloqueado BOOLEAN; + """) + # gravando no bd + self.db.commit_db() + print("Novo campo adicionado com sucesso.") + except sqlite3.OperationalError: + print("Aviso: O campo 'bloqueado' já existe.") + return False + + + +Lendo as informações do banco de dados +-------------------------------------- + +Obtendo informações da tabela + +.. code-block:: python + + def table_info(self): + t = self.db.cursor.execute( + 'PRAGMA table_info({})'.format(self.tb_name)) + colunas = [tupla[1] for tupla in t.fetchall()] + print('Colunas:', colunas) + +Chamando e vendo o resultado: + +.. code-block:: bash + + >>> c.table_info() + Colunas: ['id', 'nome', 'idade', 'cpf', 'email', 'fone', 'cidade', 'uf', 'criado_em'] + + +Listando as tabelas do bd + +.. code-block:: python + + def table_list(self): + l = self.db.cursor.execute(""" + SELECT name FROM sqlite_master WHERE type='table' ORDER BY name + """) + print('Tabelas:') + for tabela in l.fetchall(): + print("%s" % (tabela)) + +Chamando e vendo o resultado: + +.. code-block:: bash + + >>> c.table_list() + Tabelas: + clientes + sqlite_sequence + + +Obtendo o schema da tabela + +.. code-block:: python + + def table_schema(self): + s = self.db.cursor.execute(""" + SELECT sql FROM sqlite_master WHERE type='table' AND name=? + """, (self.tb_name,)) + + print('Schema:') + for schema in s.fetchall(): + print("%s" % (schema)) + +Chamando e vendo o resultado: + +.. code-block:: sql + + >>> c.table_schema() + Schema: + CREATE TABLE clientes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nome TEXT NOT NULL, + idade INTEGER, + cpf VARCHAR(11) NOT NULL, + email TEXT NOT NULL UNIQUE, + fone TEXT, + cidade TEXT, + uf VARCHAR(2) NOT NULL, + criado_em DATETIME NOT NULL + ) + + +Fazendo backup do banco de dados (exportando dados) +--------------------------------------------------- + +.. code-block:: python + + import io + ... + def backup(self, file_name='sql/clientes_bkp.sql'): + with io.open(file_name, 'w') as f: + for linha in self.db.conn.iterdump(): + f.write('%s\n' % linha) + + print('Backup realizado com sucesso.') + print('Salvo como %s' % file_name) + +Se quiser pode salvar com outro nome. + +.. code-block:: python + + c.backup('sql/clientes_backup.sql') + + +Recuperando o banco de dados (importando dados) +----------------------------------------------- + +Aqui nós usamos dois parâmetros: ``db_name`` para o banco de dados recuperado (no caso, um banco novo) e ``file_name`` para o nome do arquivo de backup com as instruções SQL salvas. + +.. code-block:: python + + def importar_dados(self, db_name='clientes_recovery.db', file_name='sql/clientes_bkp.sql'): + try: + self.db = Connect(db_name) + f = io.open(file_name, 'r') + sql = f.read() + self.db.cursor.executescript(sql) + print('Banco de dados recuperado com sucesso.') + print('Salvo como %s' % db_name) + except sqlite3.OperationalError: + print( + "Aviso: O banco de dados %s já existe. Exclua-o e faça novamente." % + db_name) + return False + +Fechando conexão: + +.. code-block:: python + + def fechar_conexao(self): + self.db.close_db() + + +Conectando-se a outro banco +--------------------------- + +Agora, no mesmo arquivo `manager_db.py `_ vamos criar uma outra instância chamada ``PessoasDb()``. Neste exemplo vamos relacionar duas tabelas: ``pessoas`` e ``cidades``. + +Veja na figura a seguir como as tabelas se relacionam. + +.. image:: images/regisdasilva/tabelas.jpg + :alt: tabelas.jpg + +Agora os códigos: + +.. code-block:: python + + class PessoasDb(object): + + tb_name = 'pessoas' + + def __init__(self): + self.db = Connect('pessoas.db') + self.tb_name + +Criando o *schema* a partir de `pessoas_schema.sql `_. + +.. code-block:: python + + def criar_schema(self, schema_name='sql/pessoas_schema.sql'): + print("Criando tabela %s ..." % self.tb_name) + + try: + with open(schema_name, 'rt') as f: + schema = f.read() + self.db.cursor.executescript(schema) + except sqlite3.Error: + print("Aviso: A tabela %s já existe." % self.tb_name) + return False + + print("Tabela %s criada com sucesso." % self.tb_name) + +Inserindo as cidades a partir de `cidades.csv `_. + +.. code-block:: python + + def inserir_de_csv(self, file_name='csv/cidades.csv'): + try: + c = csv.reader( + open(file_name, 'rt'), delimiter=',') + t = (c,) + for t in c: + self.db.cursor.execute(""" + INSERT INTO cidades (cidade, uf) + VALUES (?,?) + """, t) + # gravando no bd + self.db.commit_db() + print("Dados importados do csv com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: A cidade deve ser única.") + return False + +Agora vamos contar quantas cidades temos na tabela... + +.. code-block:: python + + def gen_cidade(self): + ''' conta quantas cidades estão cadastradas e escolhe uma delas pelo id. ''' + sql = 'SELECT COUNT(*) FROM cidades' + q = self.db.cursor.execute(sql) + return q.fetchone()[0] + +para a partir dai gerar valores randômicos apenas com as cidades existentes. + +.. code-block:: python + + def inserir_randomico(self, repeat=10): + lista = [] + for _ in range(repeat): + fname = names.get_first_name() + lname = names.get_last_name() + email = fname[0].lower() + '.' + lname.lower() + '@email.com' + cidade_id = random.randint(1, self.gen_cidade()) + lista.append((fname, lname, email, cidade_id)) + try: + self.db.cursor.executemany(""" + INSERT INTO pessoas (nome, sobrenome, email, cidade_id) + VALUES (?,?,?,?) + """, lista) + self.db.commit_db() + print("Inserindo %s registros na tabela..." % repeat) + print("Registros criados com sucesso.") + except sqlite3.IntegrityError: + print("Aviso: O email deve ser único.") + return False + +Agora é só alegria! + +.. code-block:: python + + def ler_todas_pessoas(self): + sql = 'SELECT * FROM pessoas INNER JOIN cidades ON pessoas.cidade_id = cidades.id' + r = self.db.cursor.execute(sql) + return r.fetchall() + + def imprimir_todas_pessoas(self): + lista = self.ler_todas_pessoas() + for c in lista: + print(c) + + # myselect, imprime todos os nomes que começam com R + def meu_select(self, sql="SELECT * FROM pessoas WHERE nome LIKE 'R%' ORDER BY nome;"): + r = self.db.cursor.execute(sql) + self.db.commit_db() + print('Nomes que começam com R:') + for c in r.fetchall(): + print(c) + + def table_list(self): + # listando as tabelas do bd + l = self.db.cursor.execute(""" + SELECT name FROM sqlite_master WHERE type='table' ORDER BY name + """) + print('Tabelas:') + for tabela in l.fetchall(): + print("%s" % (tabela)) + + def fechar_conexao(self): + self.db.close_db() + +Chamando tudo no **modo interativo** + +.. code-block:: python + + >>> from manager_db import * + >>> p = PessoasDb() + >>> p.criar_schema() + >>> p.inserir_de_csv() + >>> p.gen_cidade() + >>> p.inserir_randomico(100) + >>> p.imprimir_todas_pessoas() + >>> p.meu_select() + >>> p.table_list() + >>> p.fechar_conexao() + + +Exemplos +-------- + +.. Assista os videos no `youtube `_ . + +Veja os exemplos no `github `_. + +Referências +----------- + +`sqlite3 — DB-API 2.0 interface for SQLite databases `_ +`sqlite3 Embedded Relational Database `_ +`Lets Talk to a SQLite Database with Python `_ +`Advanced SQLite Usage in Python `_ +`Python A Simple Step by Step SQLite Tutorial `_ \ No newline at end of file diff --git a/content/images/regisdasilva/tabelas.jpg b/content/images/regisdasilva/tabelas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac70cecd20563e83685a9bb6f21e0b8e8783e77d GIT binary patch literal 85033 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 y%_>#q0wn*CVTw)23N`}xs zh2o2w_jts1GQ!}ErJTghMYn`Ij(n&0zB?C+Ta#fAsf%f^59$tn-R#&S4}siLo4t0x ziLl(A3kc6&Zs)6V5`B>^zgwPD zAWlD9f%;r?zi1)h$S`A^E!>M@*^B182k#rCl4zw(4EK|fG03;@fjBHxEAeMifRG;w zaw}E<0N#!7wdTslD$gIUKd-QCsQlBe>Th(`QH=dgK}P({;4e0Y?9g<^`mCvS@3Ujt XzqQT%S1(-$t4 Date: Sun, 23 Nov 2014 01:14:25 -0200 Subject: [PATCH 2/3] python + sqlite - pt 2 --- content/gerenciando-banco-dados-sqlite3-python-parte2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/gerenciando-banco-dados-sqlite3-python-parte2.rst b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst index 8a5d83072..a6b47c6ab 100644 --- a/content/gerenciando-banco-dados-sqlite3-python-parte2.rst +++ b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst @@ -852,7 +852,7 @@ Novamente você pode usar qualquer instrução SQL porque o ``commit_db()`` já .. code-block:: python - c.ler_arquivo('sql/`clientes_maior60.sql `_') + c.ler_arquivo('sql/clientes_maior60.sql') Update - Alterando os dados From 185946222bc4030c5075bf04df6f7e0dd8d36d06 Mon Sep 17 00:00:00 2001 From: rg3915 Date: Sun, 23 Nov 2014 01:43:44 -0200 Subject: [PATCH 3/3] python + sqlite - pt 2.1 --- ...nciando-banco-dados-sqlite3-python-parte2.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/gerenciando-banco-dados-sqlite3-python-parte2.rst b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst index a6b47c6ab..96bfa7955 100644 --- a/content/gerenciando-banco-dados-sqlite3-python-parte2.rst +++ b/content/gerenciando-banco-dados-sqlite3-python-parte2.rst @@ -1,7 +1,7 @@ Gerenciando banco de dados SQLite3 com Python - Parte 2 ======================================================= -:date: 2014-10-05 23:59 +:date: 2014-11-23 23:59 :tags: Python, Banco de dados :category: Python, Banco de dados :slug: gerenciando-banco-dados-sqlite3-python-parte2 @@ -231,12 +231,12 @@ A função ``gen_city()`` escolhe uma cidade numa lista com o comando `random.ch .. code-block:: python def gen_city(): - list_city = [ - [u'São Paulo', 'SP'], - [u'Rio de Janeiro', 'RJ'], - [u'Porto Alegre', 'RS'], - [u'Campo Grande', 'MS']] - return random.choice(list_city) + list_city = [ + [u'São Paulo', 'SP'], + [u'Rio de Janeiro', 'RJ'], + [u'Porto Alegre', 'RS'], + [u'Campo Grande', 'MS']] + return random.choice(list_city) Conectando e desconectando do banco @@ -594,7 +594,7 @@ Agora vamos importar os dados de `clientes.csv `_ como podemos gerar dados randômicos para criar um novo `clientes.csv `_s. +**Obs**: Veja em `gen_csv.py `_ como podemos gerar dados randômicos para criar um novo `clientes.csv `_. Inserindo um registro com parâmetros de entrada definido pelo usuário ---------------------------------------------------------------------