Um tutorial passo a passo para SQLite em Python

Se você não tem nada a ver com programação, nem tem interesse no assunto, simplesmente ignore este artigo.


Mike Driscoll tem um blog dedicado a Python chamado The Mouse vs. the Python e eventualmente há excelentes artigos por lá.
Esta é uma tradução livre do artigo Python: A Simple Step-by-Step SQLite Tutorial e modifiquei sutilmente algumas coisas, incluindo os exemplos. Agradeço ao Mike pelos excelentes artigos e me desculpo pelas liberdades que tomei na tradução (incluindo a mudança no nome do artigo). Vamos a ele!


SQLite é uma engine de banco de dados transacional autocontida que dispensa servidor e configuração. Python ganhou o módulo sqlite3 desde a versão 2.5, o que significa que você pode criar bancos de dados SQLite em qualquer Python, sem precisar baixar qualquer dependência adicional. A Mozilla usa bancos de dados SQLite para o Firefox armazenar marcadores e outras informações. Neste artigo, você aprenderá:

  • Como criar um banco de dados SQLite
  • Como inserir dados em uma tabela
  • Como editar os dados
  • Como deletar os dados
  • Consultas básicas de SQL

Este artigo será similar em função ao recente SQLAlchemy tutorial, que apareceu no site The Mouse vs. the Python um mês desses. Se você quiser inspecionar seus bancos de dados visualmente, você pode usar o plugin SQLite Manager para Firefox, ou se preferir pode partir para a linha de comando shell do SQLite.

Como criar um banco de dados e inserir qualquer coisa

Criar um banco de dados no SQLite é realmente muito simples, mas o processo requer que você conheça um pouco de SQL. Aqui está o código para criar um banco de dados de gerenciamento de albuns musicais:
import sqlite3

conn = sqlite3.connect(
"mydatabase.db") # ou use :memory: para botá-lo na memória RAM

cursor = conn.cursor()

# cria uma tabela
cursor.execute("""CREATE TABLE albums
                 (title text, artist text, release_date text,
                  publisher text, media_type text)
              """
)
Antes de mais nada, precisamos importar a biblioteca sqlite3 e criar uma conexão com o banco de dados. Você pode passar para ele um caminho para o arquivo, o nome do arquivo ou usar simplesmente a string especial “:memory:” e criar um banco de dados na memória. No nosso caso, criamos um arquivo no disco chamado mydatabase.db. Em seguida, criamos um objeto cursos, que lhe permite interagir com o banco de dados e adicionar registro, entre outras coisas. Usamos aqui a sintaxe SQL para criar uma tabela chamada albums e contendo 5 campos de texto: title, artist, release_date, publisher e media_type. SQLite só suporta cinco tipos de dados: null, integer, real, text and blob. Vamos agora fazer o código para inserir alguns dados na tabela!
# insere alguns dados
cursor.execute("INSERT INTO albums VALUES ('Glow', 'Andy Hunter', '7/24/2012', 'Xplore Records', 'MP3')")

# salva dados no banco
conn.commit()

# insere múltiplos registros de uma só vez usando o método "?", que é mais seguro
albums = [('Exodus', 'Andy Hunter', '7/9/2002', 'Sparrow Records', 'CD'),
         (
'Until We Have Faces', 'Red', '2/1/2011', 'Essential Records', 'CD'),
         (
'The End is Where We Begin', 'Thousand Foot Krutch', '4/17/2012', 'TFKmusic', 'CD'),
         (
'The Good Life', 'Trip Lee', '4/10/2012', 'Reach Records', 'CD')]
cursor.executemany(
"INSERT INTO albums VALUES (?,?,?,?,?)", albums)
conn.commit()

Aqui usamos o comando INSERT INTO, do SQL, para inserir um registro dentro do banco de dados. Note que cada item tem que estar envolto entre aspas simples. Isso pode ficar complicado quando você precisar inserir strings já com aspas simples incluídas. De qualquer forma, para salvar o registro no banco, nós chamamos o commit. O código que vem em seguida mostra como adicionar múltiplos registros de uma só vez usando o método executemany do cursor. Note que usamos a interrogação (?) ao invés da substituição de string (%s) para inserir valores. Usar a substituição de strings NÃO é seguro e não deve ser usado, pois pode permitir ataques de SQL injection. O método da interrogação é muito melhor e usando o SQLAlchemy é sempre melhor, pois ele faz todo o tratamento para você, e você não precisará se preocupar em converter aspas simples em algo que o SQLite aceite.

Atuializando e deletando registros

Estar apto a atualizar seus registros no banco de dados é a chave para manter seus dados nos conformes. Se você não atualizar, seus dados se tornarão rapidamente obsoletos e sem utilidade. Algumas vezes você também desejará deletar linhas dos seus dados. Cobriremos esses dois tópicos nesta sessão. Primeiro, hora de atualizar!
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
cursor = conn.cursor()

sql =
"""
UPDATE albums
SET artist = 'John Doe'
WHERE artist = 'Andy Hunter'
"""

cursor.execute(sql)
conn.commit()

Aqui usamos o comando UPDATE do SQL para atualizar nossa tabela albums. Você pode usar SET para mudar um campo, neste caso mudamos o campo artista para ser “John Doe” em qualquer registro onde o campo artist era “Andy Hunter”. Não é fácil? Note que se você não confirmar as mudanças com o commit, suas mudanças não serão escritas no banco de dados e não terão efeito. O comando DELETE é simples também. Vamos a ele!
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
cursor = conn.cursor()

sql =
"""
DELETE FROM albums
WHERE artist = 'John Doe'
"""

cursor.execute(sql)
conn.commit()

Deletar chega a ser mais fácil do que atualizar. O SQL só tem 2 linhas! Neste caso, tudo o que temos que fazer é dizer pro SQLite de que tabela deletar (albums) e quais registros deletar, usando a cláusula WHERE. O comando do exemplo apaga todo e qualquer registro que tenha “John Doe” no campo artist.

Consultas básicas do SQLite

Consultas no SQLite são basicamente as mesmas que você usa para outros bancos de dados, como o MySQL ou o Postgres. Basta você usar a sintaxe SQL normal para elaborar as consultas e executá-las com o cursor. Aqui estão alguns exemplos:
import sqlite3

conn = sqlite3.connect(
"mydatabase.db")
#conn.row_factory = sqlite3.Row
cursor = conn.cursor()

sql =
"SELECT * FROM albums WHERE artist=?"
cursor.execute(sql, [("Red")])
print cursor.fetchall()  # ou use fetchone()

print "\nAqui a lista de todos os registros na tabela:\n"
for row in cursor.execute("SELECT rowid, * FROM albums ORDER BY artist"):
   
print row

print "\nResultados de uma consulta com LIKE:\n"
sql = """
SELECT * FROM albums
WHERE title LIKE 'The%'"""

cursor.execute(sql)
print cursor.fetchall()

A primeira consulta que executamos é um SELECT * , o que significa que estamos buscando todos os campos, e buscamos todos os registros cujo nome do artista (campo artist) bata com o que informamos - no nosso caso, “Red”. Em seguida, executamos o SQL e usamos fetchall() para pegar todos os resultados. Você também pode usar fetchone() para pegar o apenas primeiro resultado. Você também notará que há uma sessão comentada relacionada com um misterioso row_factory. Se você descomentar aquela linha, os resultados serão retornados como objetos Row, que são como os dicionários do Python. Entretanto, você não pode fazer associação de item com um objeto Row.

A segunda consulta é bem parecida com a primeira, mas retorna os registros ordenados pelo nome do artista, em ordem ascendente. Esse código também demonstra como podemos percorrer o resultado executando ações. A última consulta mostra como usar o comando LIDE do SQL para buscar frases parciais.Neste caso, fizemos uma busca pela tabela por títulos que comecem com "The". O sinal de porcentagem (%) é o operador coringa.

Pra terminar

Agora você sabe como usar o Python para criar um banco de dados SQLite. Você também pode criar, atualizar e deletar registros, bem como executar consultas em seu banco de dados. Vá em frente e comece a fazer seus próprios bancos / ou compartilhe suas experiências nos comentários!

P. S.: Foto usada no post: water moccassin (poisonous) or western hognose (not poisonous), de Bikes And Books.

Special: 
Avalie: 
Average: 3.4 (66 votes)

Comentários

imagem de John Little
Enviado por John Little (não verificado) em 24. Abril 2013 - 10:27

Dear Sir.  I am very flattered to see you use my photograph <http://www.flickr.com/photos/bikesandbooks/4747563978/> in your article <http://www.carlissongaldino.com.br/post/um-tutorial-passo-passo-para-sql... Please follow Creative Commons Guidelines <http://creativecommons.org/licenses/by-nc-sa/2.0/deed.pt_BR>.  The terms of sharing/using this photograph include Atribuição, Uso não comercial, and Compartilhamento pela mesma licença.  Thank you for cooperation.

Please also excuse the sloppy translation of this message into Portuguese.  I have never studied the language and am using Google Translate in an effort to reach out to you.

For Attribution you may make a caption under the photograph using the name, BikesAndBooks linked to <http://www.flickr.com/people/bikesandbooks/>.  Thank you for also adhering to the other Creative Commons practice noted above (see link).

--John Little (Bikes and Books)
bikesandbooks@gmail.com
http://www.flickr.com/people/bikesandbooks/

imagem de John Little
Enviado por John Little (não verificado) em 24. Abril 2013 - 10:34

Caro senhor. Estou muito lisonjeado por ver você usar minha fotografia <http://www.flickr.com/photos/bikesandbooks/4747563978/> em seu artigo <http://www.carlissongaldino.com.br/post/um-tutorial- Passo-Passo-para-sqlite-em-python>. Por favor, siga Creative Commons Diretrizes <http://creativecommons.org/licenses/by-nc-sa/2.0/deed.pt_BR>. Os termos de partilha / usando esta fotografia incluem Atribuição, Uso Localidade: Não comercial e Compartilhamento Pela MESMA LICENÇA. Obrigado pela cooperação.

Por favor, desculpem a tradução malfeita de esta mensagem em Português. Eu nunca estudou a língua e estou usando o Google Translate, em um esforço para chegar até você.

Para Attribution você pode fazer uma legenda sob a foto usando o nome, BikesAndBooks ligada à <http://www.flickr.com/people/bikesandbooks/>. Obrigado por também aderir à outra prática Creative Commons mencionado acima (ver link).

- John Little (BikesAndBooks)
bikesandbooks@gmail.com
http://www.flickr.com/people/bikesandbooks/

imagem de bardo
Enviado por bardo em 24. Abril 2013 - 18:24

Obrigado pelo contato. Sua foto é uma foto muito bonita.  Quanto ao licenciamento, todo o conteúdo do meu site está disponível sob a CC-BY-NC-SA, exceto quando dito o contrário (inclusive no rodapé das páginas há um link para a licença), por isso achei que seria desnecessário e redundante colocar essa informação adicionalmente no post. Quanto à atribuição, todas as fotos (não-minhas) que eu insiro em algum post eu coloco no fim do post referência ao autor + link para a foto no local onde eu tirei. O artigo em questão tem na última linha: P. S.: Foto usada no post: water moccassin (poisonous) or western hognose (not poisonous), de Bikes And Books. Você considera isso insuficiente?

imagem de Volney Casas
Enviado por Volney Casas (não verificado) em 7. Julho 2014 - 20:04

Tem como a consulta me retornar o valor real da table?

Porque retorna algo tipo (22.5,) ao invés do valor float, no caso eu queria pegar esse valor e inserir em outra tabela.

imagem de Xinuo
Enviado por Xinuo (não verificado) em 3. Setembro 2015 - 18:59

Artigo útil. Estou mexendo num pequeno banco SQLite e gostei de ver a simplicidade e praticidade do Python para fazer alterações no banco.

De certo que o artigo foi baseado em algum exemplo em inglês, mas aqui deixo minha crítica: no campo data, que é um texto, devido ao SQLite não ter um tipo específico, foi colocada a data no formato (ridículo) usado nos EUA, que é Mês/Dia/Ano.

Com isso qualquer pesquisa que envolva esse campo ou em que haja classificação envolvendo esse campo terá que ser feita com cuidado, pois haverá grande chance estar errada.

Já me deparei com software comercial onde o cara que desenvolveu comete esse erro básico e idiota de guardar a data de um jeito que não ajuda e só atrapalha.

Creio que o mais correto é guardar a data no formato ISO: ANO-MÊS-DIA, pois é fácil descobrir que a data está nesse formato e que deixa o campo sucetível e livre para usar em comparações e ordenações.

É claro que se é para guardar no banco de forma otimizada, essa não é a melhor escolha, mas pelo menos facilta nas consultas ordenadas.

imagem de bardo
Enviado por bardo em 4. Setembro 2015 - 9:04

Excelente dica! Gosto muito desse formato "Y-M-D' para nomes de arquivos e acredito que seja mesmo o formato ideal para representarmos data em modo textual, sem tipo próprio específico. Especialmente pelo fato de, neste caso, a ordem cronológica bater com a ordem alfabética.

[]s

imagem de Flipe Garcia
Enviado por Flipe Garcia (não verificado) em 21. Novembro 2017 - 16:55

Olá Cárlisson. Obrigado por compartilhar estas informações de forma tão simples. Tenho uma dúvida que poderá complementar o  conteúdo analisado. Eu já criei a base e a tabela com a minha aplicação, e salvei vários dados e estão OK. Contudo, se em outra oportunidade (outro dia) abro a aplicação, reconhece a base e a tabela, mas dá erro ao salvar os dados. Ou seja, a ideia é inserir (acrescentar) novos dados na mesma base/tabela o que não está acontecendo. Como faço então?
Além disso, tenho como saber a quantidade de registros (dados) na tabela?
Usei estes comandos: INSERT INTO tabela VALUES (....) e REPLACE INTO tabela VALUES (....).
Obrigado

imagem de bardo
Enviado por bardo em 22. Novembro 2017 - 17:44

Salve! Fico feliz ter ajudado. Como não lido com isso cotidianamente, creio não poder te ajudar nessas dúvidas. Espero que alguém leia e responda aqui no blog mesmo, que já fica registrado.

[]s

Comentar


Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0