Contents

Een registratie-app maken met Python en een database

Python heeft uitstekende databaseondersteuning ingebouwd in de standaardbibliotheek, zodat u een database kunt maken en ermee kunt werken zonder afhankelijk te zijn van externe frameworks zoals de Django ORM.

Python’s integratie met SQLite biedt een efficiënte oplossing voor het beheren van gegevensopslag door zijn lichtgewicht structuur, waardoor het toegankelijk is voor ontwikkelaars die hun applicaties willen verbeteren. Door een eenvoudige applicatie voor gebruikersregistratie te implementeren, kan men inzicht krijgen in de fundamentele concepten van databaseprogrammering binnen het Python ecosysteem.

Hoe maak je een database in Python

De code in deze tutorial is beschikbaar op een GitHub repository, waartoe je toegang kunt krijgen om de hierin besproken concepten te verkennen en te implementeren.

Om met Python te communiceren met een database is het essentieel om zowel een verbindingsobject als een cursorobject te hebben. De eerste maakt het mogelijk om een link te leggen tussen de applicatie en de database, terwijl de tweede het mogelijk maakt om SQL statements uit te voeren in de database.

Om een verbinding te maken tussen je Python-applicatie en een bestaande database, of om een nieuwe database aan te maken met SQLite, zijn er specifieke stappen die gevolgd moeten worden. Het proces van het maken van een databaseverbinding in Python voor SQLite omvat een aantal belangrijke onderdelen zoals het specificeren van de database-engine, het verstrekken van de nodige referenties, het definiëren van de verbindingsparameters en ten slotte het maken van een verbinding met de gewenste database-instantie. Door deze stappen zorgvuldig te volgen, is het mogelijk om met succes een veilige en efficiënte databaseverbinding op te zetten binnen uw Python-codebase met behulp van de kracht van SQLite.

 import sqlite3

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

# Close the connection
conn.close()

De methode connect() accepteert een directory die een bestaand databasebestand vertegenwoordigt. In het geval dat het gespecificeerde pad geen database bevat, zal er een worden gemaakt. Het wordt aanbevolen om de databaseverbinding los te laten na voltooiing van interacties voor efficiënt beheer van bronnen.

Om interactie met een verbonden database in Python mogelijk te maken, is het nodig om een cursor te gebruiken. De implementatie van een cursor maakt het mogelijk om Gestructureerde Query Taal (SQL) queries uit te voeren binnen de grenzen van een Python programma. Volg deze stappen om een cursor te maken:

 cursor = conn.cursor()

# Close the cursor
cursor.close()

Een open verbindingsobject kan worden gebruikt om een cursor te genereren door de methode cursor() aan te roepen.

Een databasetransactie uitvoeren in Python

Met behulp van een cursor kunnen SQL-statements, zoekopdrachten of scriptreeksen worden uitgevoerd om gegevens op te halen of te wijzigen, of om de configuratie van het databaseschema aan te passen.

Er zijn drie primaire benaderingen die men kan gebruiken om een databasetransactie uit te voeren, namelijk:

⭐ Cursor.execute . Deze methode voert een enkele SQL-instructie uit. Dit is hoe je het gebruikt:

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

Deze code roept de methode execute aan op een cursor en geeft deze een string door die een SQL-instructie bevat.

⭐ Cursor.executemany . Met deze methode kun je dezelfde SQL-instructie meerdere keren uitvoeren, telkens met andere parameters. De methode heeft twee argumenten: de SQL-instructie en een iterable. Je kunt deze methode goed gebruiken om meerdere objecten tegelijk in de database in te voegen:

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

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

De bovenstaande code gebruikt de executemany methode om meerdere keren waarden in de database in te voegen.

Let op de placeholder-instanties in de gegeven SQL-instructie. De methode executemany zal vervolgens de respectieve gegevens voor elk afzonderlijk item invoegen.

⭐ Cursor.executescript . Zoals de naam al aangeeft, voert deze methode een SQL-script voor je uit. Je kunt je SQL statements in een ander bestand schrijven en ze uitvoeren met de executescript methode:

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

cursor.executescript(sql_script)

Hoe bouw je een registratieapplicatie met Python en SQLite3

Om een effectieve registratieapplicatie te ontwikkelen, moet je de gegevens van de eindgebruiker vastleggen met Python en ze vervolgens bewaren in een relationeel databasemanagementsysteem zoals SQLite3. Deze serie richtlijnen illustreert het proces voor het bouwen van een rudimentair registratieplatform met Python en SQLite3.

Stap 1: Verbind met een bestaande database of creëer een nieuwe

Om met je applicatie te kunnen beginnen, is het nodig om een nieuwe database aan te maken of om te integreren met een bestaande database.

 import sqlite3

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

cursor = conn.cursor()

# your app's code goes here

cursor.close()

conn.close()

De code maakt een verbinding met de database door een verbindingsobject te maken, dat de communicatie tussen de applicatie en de database vergemakkelijkt. Daarnaast genereert het een cursor die het mogelijk maakt om efficiënt gegevens uit de database op te halen als antwoord op SQL-query’s.

Stap 2: Maak een tabel voor gebruikers

Om een gegevensopslagplaats voor gebruikersregistraties te maken, is het nodig om een tabel te genereren met behulp van de muiscursor.Dit kan worden bereikt door gebruik te maken van de volgende stappen:

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

conn.commit()

De huidige implementatie vergemakkelijkt het aanmaken van een tabel met de naam “gebruikers” in een bestaande database, als die nog niet bestaat. Door middel van dit proces worden vier verschillende kolommen geconstrueerd om gegevens van individuele gebruikers in onder te brengen. In het bijzonder dient de voorziening van een enkel “e-mail”-veld als een mechanisme om te voorkomen dat gebruikers meerdere registraties aanmaken onder identieke e-mailadressen, waardoor ervoor wordt gezorgd dat elke account uniek identificeerbaar en onderscheidend blijft.

Het uitvoeren van conn.commit is inderdaad cruciaal voor het vastleggen van de query in de database, zonder welke geen wijzigingen in de database zouden worden weergegeven.

Het gebruik van de executescript methode biedt een alternatieve aanpak door het COMMIT statement direct in het SQL script op te nemen, waardoor het niet meer nodig is om conn.commit expliciet aan te roepen.

Stap 3: Gebruikersgegevens verzamelen

Het opnemen van Python-functies vergemakkelijkt het hergebruik van code, waardoor het verstandig is om een functie te maken die het registratieaspect beheert. Deze functie verzamelt de voornaam, achternaam, het e-mailadres en het wachtwoord van de gebruiker.

 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: ")

Stap 4: Controleer de juistheid van het wachtwoord

Zeker, hier is een voorbeeld van hoe je de functie register_user in Python zou kunnen wijzigen om gebruikers te vragen hun wachtwoord twee keer in te voeren en opnieuw te vragen als ze niet overeenkomen:pythondef register_user(username, email, password):# Controleer of gebruikersnaam al bestaatsexisting_user = User.objects.filter(gebruikersnaam=gebruikersnaam).first()if existing_user:raise ValueError(“Gebruikersnaam al bezet”)# Maak nieuw gebruikersobjectuser = User.objects.create_user(gebruikersnaam, e-mail, wachtwoord)# Sla gebruikersobject op in databaseuser.save()return f"{gebruikersnaam}, {email} - {wachtwoord}"

 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")

Om ervoor te zorgen dat accounts nauwkeurig worden aangemaakt, moeten gebruikers nu bij registratie controleren of het opgegeven wachtwoord identiek is. Deze maatregel elimineert potentiële discrepanties in gebruikersnaam- en wachtwoordcombinaties en verbetert zo de algehele integriteit van het systeem.

Stap 5: E-mail uniciteit controleren

De SQL-instructie die de tabel gebruikers aanmaakt, bepaalt dat het veld e-mail onderscheidend moet zijn. Als een gebruiker zich probeert te registreren met een e-mailadres dat al eerder is geregistreerd, genereert het databasemanagementsysteem een uitzondering.Om ervoor te zorgen dat uw toepassing effectief en elegant op deze situatie reageert, is het noodzakelijk om geschikte afhandelingsmechanismen in uw Python-code te implementeren om de gegenereerde uitzondering te beheren en te verwerken.

 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.")

De huidige implementatie maakt gebruik van een try-except clausule om eventuele fouten te beheren die het gevolg zijn van dubbele e-mailadressen tijdens het bewerken van de databank. Als er in de loop van het iteratieve proces een IntegrityError optreedt, wordt de besturingsstroom teruggeleid naar de invoeraanvraag voor een afzonderlijk e-mailadres van de gebruiker.

In deze specifieke toepassing is het redelijk om aan te nemen dat elk geval van een IntegrityError bij het aanmaken van een nieuwe gebruikersaccount wordt veroorzaakt door de aanwezigheid van een gedupliceerd e-mailadres. In een praktische omgeving kan echter een uitgebreidere aanpak voor het afhandelen van fouten worden gebruikt, die meer problemen kan omvatten dan alleen duplicaten binnen het e-maildomein.

Stap 6: De gegevens van de gebruiker in de database invoegen

Om de verzamelde informatie van een gebruiker in een database te kunnen invoegen, moet een SQL-instructie (structured query language) worden uitgevoerd. Om deze taak uit te voeren, kan iemand een SQL-query in zijn programma gebruiken. Door het try-except-blok dienovereenkomstig aan te passen, kan de applicatie de gegevens van de gebruiker met succes in de database opslaan.

 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.")

In het bijgewerkte try-except statement voert de cursor een SQL invoegactie uit. Vervolgens start de methode conn.commit de SQL-bewerking op de database.

Als je alle bovenstaande stappen hebt gevolgd, zou je een applicatie moeten hebben die gebruikers registreert en opslaat in de database. Je kunt een app zoals DB Browser for SQLite gebruiken om de inhoud van je database te bekijken:

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

Databases gebruiken in plaats van Collectietypes

Voor kleinschalige toepassingen met relatief eenvoudige gegevensstructuren kan het maken van aangepaste SQL-query’s of het gebruik van een lichtgewicht Object Relational Mapping (ORM) bibliotheek zoals SQLAlchemy een praktische aanpak zijn. Echter, bij het ontwikkelen van grotere, meer ingewikkelde systemen waarbij gegevensrelaties steeds uitgebreider worden, kan het gebruik van een gevestigd framework zoals Django’s ORM aanzienlijke voordelen bieden op het gebied van efficiëntie, onderhoudbaarheid en uitbreidbaarheid.

Om uw vaardigheid in low-level databasebewerkingen verder aan te scherpen, kunt u overwegen een aanmeldmechanisme te implementeren dat het bestaande gebruikersregistratieproces aanvult.