o autor selecionou o COVID-19 Relief Fund para receber uma doação como parte do programa Write for DOnations.
Introduction
SQLite is a self-contained, file-based SQL database. SQLite vem junto com Python e pode ser usado em qualquer um de seus aplicativos Python sem ter que instalar qualquer software adicional.
neste tutorial, vamos passar pelo módulo sqlite3
no Python 3., Vamos criar uma conexão a um banco de dados SQLite, adicionar uma tabela a esse banco de Dados, inserir dados nessa tabela, e ler e modificar dados nessa tabela.para este tutorial, vamos trabalhar principalmente com um inventário de peixes que precisamos modificar à medida que os peixes são adicionados ou removidos de um aquário fictício.
pré-requisitos
para tirar o máximo partido deste tutorial, recomenda-se ter alguma familiaridade com a programação em Python e algum fundo básico com SQL.,
Você pode rever estes tutoriais para as necessárias informações de plano de fundo:
- Como o Código em Python3
- Uma Introdução para Consultas MySQL
Passo 1 — Criar uma Conexão para um Banco de dados SQLite
Quando nós se conectar a um banco de dados SQLite, estamos acessando dados que, em última análise, reside em um arquivo de nosso computador. Bases de dados SQLite são totalmente caracterizados motores SQL que podem ser usados para muitos propósitos. Por agora, vamos considerar uma base de dados que rastreie o inventário de peixes num aquário fictício.,
Nós pode se conectar a um banco de dados SQLite usando o Python sqlite3
módulo:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
dá o nosso programa Python acesso a sqlite3
módulo. A função sqlite3.connect()
devolve um Connection
objecto que utilizaremos para interagir com a base de dados SQLite guardada no ficheiro aquarium.db
. aquarium.db
arquivo é criado automaticamente pelo sqlite3.connect()
se aquarium.db
já não existe em nosso computador.,
podemos verificar que nós criado com êxito o nosso connection
objeto executando:
print(connection.total_changes)
Se executar este código Python, vamos ver o resultado como:
Output0
connection.total_changes
é o número total de linhas do banco de dados que tenham sido alterados por connection
. Uma vez que ainda não executámos nenhum comando SQL, 0 total_changes
está correcto.
Se, a qualquer momento, descobrirmos que queremos iniciar este tutorial novamente, podemos excluir o arquivo aquarium.db
do nosso computador.,
Nota: também é possível se conectar a um banco de dados SQLite que reside estritamente na memória (e não em um arquivo), passando a seqüência de caracteres especiais ":memory:"
dentro de sqlite3.connect()
. Por exemplo, sqlite3.connect(":memory:")
. A base de dados ":memory:"
SQLite desaparecerá assim que o seu programa Python sair. Isto pode ser conveniente se você quiser uma caixa de areia temporária para experimentar algo no SQLite, e não precisa persistir quaisquer dados após a saída do seu programa.,
Step 2 — Adicionando dados à base de dados SQLite
Agora que temos conectado ao aquarium.db
SQLite database, podemos começar a inserir e ler dados a partir dele.
numa base de dados SQL, os dados são armazenados nas tabelas. As tabelas definem um conjunto de colunas, e contêm 0 ou mais linhas com dados para cada uma das colunas definidas., uma tabela com o nome fish
que acompanha os seguintes dados:
nome | espécie | tank_number |
---|---|---|
Sammy | tubarão | 1 |
Jamie | choco | 7 |
fish
tabela irá controlar um valor de name
species
e tank_number
para cada peixe no aquário., Two example fish
rows are listed: one row for a shark
named Sammy
, and one row for a cuttlefish
named Jamie
.
We can create this fish
table in SQLite using the connection
we made in Step 1:
cursor = connection.cursor()cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")
connection.cursor()
returns a Cursor
object. Cursor
objects allow us to send SQL statements to a SQLite database using cursor.execute()
., "CREATE TABLE fish ..."
string é uma instrução de SQL que cria uma tabela chamada fish
com três colunas descritas anteriormente: name
do tipo TEXT
, espécies do tipo TEXT
e tank_number
do tipo INTEGER
.,
Agora que temos criado uma tabela podemos inserir linhas de dados em que:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Nós chamamos de cursor.execute()
duas vezes: uma vez para inserir uma linha para o tubarão Sammy
tanque 1
e uma vez para inserir uma linha para o choco Jamie
tanque 7
. "INSERT INTO fish VALUES ..."
é uma declaração SQL que nos permite adicionar linhas a uma tabela.,
na próxima secção, utilizaremos uma declaração SQL
para inspeccionar as linhas que acabámos de inserir na nossa tabelafish
.
Passo 3 — Leitura de dados da Base de dados SQLite
No Passo 2, adicionámos duas linhas a uma tabela SQLite chamada fish
., Podemos recuperar as linhas usando um SELECT
instrução de SQL:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Se executar este código, vamos ver uma saída semelhante ao seguinte:
Output
cursor.execute()
função executa um SELECT
instrução para obter valores para o name
species
e tank_number
colunas fish
tabela. fetchall()
recupera todos os resultados da declaração deSELECT
., When we we see a list of two tuples. Cada tupla tem três entradas; uma entrada para cada coluna que selecionamos a partir do fish
tabela. As duas tuplas têm os dados que introduziu no Passo 2: uma tupla para Sammy
shark
, e uma tupla para Jamie
cuttlefish
.,
Se a gente queria recuperar linhas fish
tabela que correspondem a um conjunto de critérios específicos, podemos usar uma WHERE
cláusula:
Se fizermos isso, vamos ver uma saída semelhante ao seguinte:
Output
Como no exemplo anterior, cursor.execute(<SQL statement>).fetchall()
permite-nos obter todos os resultados de uma SELECT
instrução. The WHERE
clause in the SELECT
statement filters for rows where the value of is target_fish_name
., Notice that we use ?
to substitute ourtarget_fish_name
variable into theSELECT
. Esperamos corresponder apenas a uma linha, e na verdade só vemos a linha para Jamie
o cuttlefish
devolvido.
AVISO: Nunca use operações de string em Python para criar dinamicamente uma string de instrução SQL. Usar as operações de texto em Python para montar um texto de declaração SQL deixa-o vulnerável aos ataques de injeção em SQL. Ataques de injeção SQL podem ser usados para roubar, alterar ou modificar dados armazenados em seu banco de dados., Use sempre o ID
substituição nas suas declarações SQL para substituir dinamicamente os valores do seu programa Python. Passar uma tupla de valores como o segundo argumento paraCursor.execute()
para ligar os seus valores à declaração SQL. Este padrão de substituição é demonstrado aqui e em outras partes deste tutorial também.
Step 4 — Modifying Data in the SQLite Database
Rows in a SQLite database can be modified usingUPDATE
andDELETE
SQL statements.,digamos, por exemplo, que Sammy the shark foi transferido para o tanque número 2. Nós pode alterar Sammy linha fish
tabela para refletir essa alteração:
a UPDATE
instrução SQL para alterar o tank_number
de Sammy
para o novo valor de 2
. WHERE
cláusula UPDATE
instrução garante que apenas altere o valor de tank_number
se uma fileira tem name = "Sammy"
.,
Se a gente execute o seguinte SELECT
instrução, podemos confirmar a nossa atualização foi feita corretamente:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Se fizermos isso, vamos ver uma saída semelhante ao seguinte:
Output
Observe que a linha Sammy
agora tem o valor de 2
para o seu tank_number
coluna.digamos que Sammy, o tubarão, foi libertado na natureza e já não está preso no aquário., Uma vez que Sammy não vive mais no aquário, faria sentido remover o Sammy
row do fish
table.
o Problema de uma DELETE
instrução SQL para remover uma linha:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
oferecemos uma DELETE
instrução de SQL para remover a linha Sammy
shark
. The WHERE
clause in the DELETE
ensured we only delete a row if that row has name = "Sammy"
.,
Se a gente execute o seguinte SELECT
instrução, podemos confirmar a nossa eliminação foi feita corretamente:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Se executar este código, vamos ver uma saída semelhante ao seguinte:
Output
Observe que a linha Sammy
shark
agora é ido, e só Jamie
cuttlefish
permanece.,
Passo 5 — Utilizar com Instruções Para Limpeza Automática
neste tutorial, usamos dois principais objetos para interagir com o "aquarium.db"
banco de dados SQLite: Connection
objeto chamado connection
e uma Cursor
objeto chamado cursor
.
da mesma forma que os arquivos Python devem ser fechados quando terminarmos de trabalhar com eles, os objetos Connection
e Cursor
os objetos também devem ser fechados quando já não são necessários.,
podemos usar uma with
instrução para nos ajudar a automaticamente fechar Connection
e Cursor
objetos:
closing
é uma função de conveniência fornecida pela contextlib
módulo. Quando uma with
instrução sai, closing
assegura que close()
é chamado em qualquer objeto que é passado para ele. A função closing
é usada duas vezes neste exemplo., De uma vez para garantir que o Connection
objeto retornado por sqlite3.connect()
é automaticamente fechada, e uma segunda vez para garantir que o Cursor
objeto retornado por connection.cursor()
é automaticamente fechada.,
Se executar este código, vamos ver uma saída semelhante ao seguinte:
Output
Desde "SELECT 1"
é uma instrução de SQL que sempre retorna uma única linha com uma coluna única, com um valor de 1
faz sentido ver uma única tupla com 1
como seu único valor retornado pelo nosso código.
Conclusion
The sqlite3
module is a powerful part of the Python standard library; it lets us work with a fully featured on-disk SQL database without installing any additional software.,
neste tutorial, aprendemos a usar o módulo sqlite3
para conectar a um banco de dados SQLite, adicionar dados a esse banco de dados, bem como ler e modificar dados nesse banco de dados. Ao longo do caminho, nós também aprendemos sobre os riscos de ataques de injeção de SQL e como usar contextlib.closing
automaticamente chamada de close()
em Python objetos with
instruções.a partir daqui podemos aprender mais sobre bases de dados SQL em SQLite vs MySQL vs PostgreSQL: uma comparação de Sistemas de gerenciamento de banco de Dados Relacionais.