Contents

Como criar uma aplicação de registo com Python e uma base de dados

Python tem excelente suporte a banco de dados embutido em sua biblioteca padrão, então você pode criar e interagir com um banco de dados sem depender de frameworks externos como o Django ORM.

A integração do Python com o SQLite oferece uma solução eficiente para gerir o armazenamento de dados através da sua estrutura leve, tornando-o acessível aos programadores que procuram melhorar as suas aplicações. Ao implementar uma aplicação simples de registo de utilizadores, é possível obter informações sobre os conceitos fundamentais da programação de bases de dados no ecossistema Python.

Como criar uma base de dados em Python

O código utilizado neste tutorial está disponível num repositório do GitHub, ao qual pode aceder para explorar e implementar os conceitos aqui discutidos.

Para estabelecer comunicação com um banco de dados usando Python, é essencial ter um objeto de conexão e um objeto cursor. O primeiro permite estabelecer uma ligação entre a aplicação e a base de dados, enquanto o segundo permite executar instruções SQL na base de dados.

Para estabelecer uma ligação entre a aplicação Python e uma base de dados existente ou, em alternativa, criar uma nova base de dados utilizando o SQLite, há passos específicos que devem ser seguidos. O processo de criação de uma ligação à base de dados em Python para SQLite envolve vários componentes chave, tais como a especificação do motor da base de dados, o fornecimento das credenciais necessárias, a definição dos parâmetros de ligação e, finalmente, a ligação à instância da base de dados desejada. Seguindo cuidadosamente estes passos, é possível estabelecer com sucesso uma ligação à base de dados segura e eficiente dentro da sua base de código Python, utilizando o poder do SQLite.

 import sqlite3

# Connect to a (new) database
conn = sqlite3.connect('path/to/database.db')

# Close the connection
conn.close()

O método connect() aceita um diretório que representa um ficheiro de base de dados existente. Caso o caminho especificado não contenha nenhuma base de dados, será criada uma. Recomenda-se a libertação da ligação à base de dados após a conclusão das interacções, para uma gestão eficiente dos recursos.

Para facilitar a interação com uma base de dados ligada em Python, é necessário utilizar um cursor. A implementação de um cursor permite a execução de consultas Structured Query Language (SQL) dentro dos limites de um programa Python. Para estabelecer um cursor, siga estes passos:

 cursor = conn.cursor()

# Close the cursor
cursor.close()

Um objeto de ligação aberto pode ser utilizado para gerar um cursor invocando o seu método cursor() .

Como executar uma transação de base de dados em Python

A utilização de um cursor permite executar instruções SQL, inquéritos ou sequências de script, com o objetivo de recuperar ou modificar dados, ou ajustar a configuração do esquema da base de dados.

Existem três abordagens principais que podem ser utilizadas para efetuar uma transação de base de dados, nomeadamente:

⭐ Cursor.execute . Este método executa uma única instrução SQL. Eis como o utilizar:

 cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        age INTEGER
    )
""")

Este código chama o método execute a um cursor, passando-lhe uma cadeia de caracteres que contém uma instrução SQL.

⭐ Cursor.executemany . Este método permite-lhe executar a mesma instrução SQL mais do que uma vez, com parâmetros diferentes de cada vez. Ele recebe dois argumentos: a instrução SQL e um iterável. Uma boa utilização para ele é inserir vários objectos na base de dados de uma só vez:

 data = [
    ('Alice', 25),
    ('Bob', 30),
    ('Charlie', 22)
]

cursor.executemany("""INSERT INTO users (name, age) VALUES (?, ?)""", data)

O código acima utiliza o método executemany para inserir valores na base de dados várias vezes.

Tenha em atenção as instâncias de espaço reservado presentes na instrução SQL. O método executemany insere subsequentemente os dados respectivos para cada item individual.

⭐ Cursor.executescript . Como o nome sugere, este método executa um script SQL por si. Pode escrever as suas instruções SQL num ficheiro diferente e executá-las com o método executescript:

 with open("path/to/script.sql") as file:
 sql_script = file.read()

cursor.executescript(sql_script)

Como construir uma aplicação de registo com Python e SQLite3

O desenvolvimento de uma aplicação de registo eficaz necessita de capturar os dados do utilizador final utilizando Python, preservando-os posteriormente num sistema de gestão de base de dados relacional como o SQLite3. Esta série de orientações ilustrará o processo de construção de uma plataforma de registo rudimentar utilizando Python e SQLite3.

Etapa 1: Ligação a uma base de dados existente ou criação de uma nova

Para iniciar o funcionamento da sua aplicação, é necessário criar uma nova base de dados ou integrá-la numa já existente.

 import sqlite3

conn = sqlite3.connect('database.db')

cursor = conn.cursor()

# your app's code goes here

cursor.close()

conn.close()

O código estabelece uma ligação com a base de dados através da criação de um objeto de ligação, que facilita a comunicação entre a aplicação e a base de dados. Além disso, gera um cursor que permite a recuperação eficiente de dados da base de dados em resposta a consultas SQL.

Passo 2: Criar uma tabela para utilizadores

Para estabelecer um repositório de dados para registos de utilizadores, é necessário gerar uma tabela utilizando o cursor do rato.Isto pode ser conseguido através da utilização dos seguintes passos:

 cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        first_name TEXT,
        last_name TEXT,
        email TEXT UNIQUE,
        password TEXT
    )
""")

conn.commit()

A presente implementação facilita a criação de uma tabela denominada “utilizadores” numa base de dados existente, caso esta ainda não esteja estabelecida. Através deste processo, são criadas quatro colunas distintas para acomodar dados relativos a utilizadores individuais. Em particular, o fornecimento de um campo “email” singular serve como um mecanismo para impedir que os utilizadores estabeleçam registos múltiplos com endereços de correio eletrónico idênticos, assegurando assim que cada conta permaneça exclusivamente identificável e distinta.

De facto, a execução de conn.commit é crucial para confirmar a consulta na base de dados, sem a qual nenhuma modificação seria reflectida na base de dados.

A utilização do método executescript proporciona uma abordagem alternativa ao incorporar a instrução COMMIT diretamente no script SQL, eliminando assim a necessidade de chamar explicitamente conn.commit .

Etapa 3: Recolher os dados do utilizador

A incorporação de funções Python facilita a reciclagem do código, pelo que é prudente estabelecer uma função que gere o aspeto do registo. Esta função acumulará o primeiro nome, o último nome, o endereço de correio eletrónico e a palavra-passe do utilizador.

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")
    email = input("Enter your email: ")
    password1 = input("Enter your password: ")
    password2 = input("Confirm your password: ")

Passo 4: Verificar a exatidão da palavra-passe

Claro, eis um exemplo de como se poderia modificar a função register_user em Python para exigir que os utilizadores introduzam as suas palavras-passe duas vezes e solicitar uma nova entrada se não corresponderem:pythondef register_user(username, email, password):# Verificar se o nome de utilizador já existesexisting_user = User.objects.filter(username=username).first()if existing_user:raise ValueError(“Username already taken”)# Criar um novo objeto de utilizadoruser = User.objects.create_user(username, email, password)# Guardar o objeto de utilizador na base de dadosuser.save()return f"{username}, {email} - {password}"

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")
    email = input("Enter your email: ")

    while True:
        password1 = input("Enter your password: ")
        password2 = input("Confirm your password: ")

        # Check password correctness
        if password1 == password2:
            print("You have successfully registered!")
            break
        else:
            print("Your passwords must match")

Para garantir a exatidão da criação de contas, os utilizadores têm agora de verificar se a palavra-passe fornecida é idêntica no momento do registo. Esta medida elimina potenciais discrepâncias nas combinações de nome de utilizador e palavra-passe, melhorando assim a integridade geral do sistema.

Passo 5: Verificar a exclusividade do e-mail

A instrução SQL que estabelece a tabela de utilizadores estipula que o campo de e-mail deve ser distinto. Consequentemente, no caso de um utilizador tentar registar-se utilizando um endereço de correio eletrónico que já tenha sido registado anteriormente, o sistema de gestão da base de dados gerará uma exceção.Para que a sua aplicação reaja eficaz e graciosamente a esta situação, é necessário implementar mecanismos de tratamento adequados no seu código Python para gerir e processar a exceção gerada.

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")

    while True:
        email = input("Enter your email: ")
        password1 = input("Enter your password: ")
        password2 = input("Confirm your password: ")

        # Check password correctness
        if password1 == password2:
            try:
                print("You have successfully created an account.")
                break
            except sqlite3.IntegrityError:
                print("Error: This email is already registered.")
        else:
            print("Your passwords must match.")

A presente implementação utiliza uma cláusula try-except para gerir quaisquer erros resultantes de endereços de correio eletrónico duplicados durante as operações da base de dados. No caso de se encontrar um IntegrityError no decurso do processo iterativo, o fluxo de controlo é reencaminhado para o pedido de entrada de um endereço de correio eletrónico distinto do utilizador.

Nesta aplicação específica, é razoável presumir que qualquer instância de um IntegrityError resultante da criação de uma nova conta de utilizador seria causada pela presença de um endereço de correio eletrónico duplicado. No entanto, num contexto prático, é possível utilizar uma abordagem mais abrangente para o tratamento de erros, que pode incluir outras questões para além de meras duplicações no domínio do correio eletrónico.

Passo 6: Inserir os dados do utilizador na base de dados

A incorporação das informações recolhidas de um utilizador numa base de dados requer a execução de uma instrução de linguagem de consulta estruturada (SQL). Para realizar essa tarefa, pode-se empregar uma consulta SQL no programa. Ao ajustar o bloco try-except em conformidade, a aplicação consegue armazenar com êxito os dados do utilizador na base de dados.

 try:
    cursor.execute("""
        INSERT INTO users (first_name, last_name, email, password)
        VALUES (?, ?, ?, ?)
    """, (first_name, last_name, email, password2))

    conn.commit()
    print("You have successfully created an account.")
    break
except sqlite3.IntegrityError:
    print("Error: This email is already registered.")

Na instrução try-except actualizada, o cursor executa uma ação de inserção SQL. Posteriormente, o método conn.commit inicia a operação SQL na base de dados.

Se seguiu todos os passos acima, deve ter uma aplicação que regista utilizadores e os guarda na base de dados. Pode utilizar uma aplicação como DB Browser for SQLite para ver o conteúdo da sua base de dados:

/pt/images/sqlite-browse-database-1.jpg

Usando bancos de dados em vez de tipos de coleção

Para aplicativos de pequena escala com estruturas de dados relativamente simples, criar consultas SQL personalizadas ou utilizar uma biblioteca de mapeamento objeto-relacional (ORM) leve, como SQLAlchemy, pode ser uma abordagem prática. No entanto, ao desenvolver sistemas maiores e mais intrincados onde os relacionamentos de dados se tornam cada vez mais elaborados, alavancar um framework estabelecido como o ORM do Django pode oferecer vantagens significativas em termos de eficiência, manutenção e extensibilidade.

Para aprimorar ainda mais sua proficiência em operações de banco de dados de baixo nível, considere a implementação de um mecanismo de login que complemente o processo de registro de usuário existente.