Hoe de sqlite3 Module te gebruiken in Python 3

de auteur selecteerde het Covid-19 Hulpfonds om een donatie te ontvangen als onderdeel van het Schrijf voor donaties programma.

Inleiding

SQLite is een op zichzelf staande, op bestanden gebaseerde SQL-database. SQLite wordt geleverd met Python en kan worden gebruikt in een van uw Python-toepassingen zonder extra software te installeren.

in deze tutorial gaan we door de sqlite3 module in Python 3., We maken een verbinding met een SQLite-database, voegen een tabel toe aan die database, voegen gegevens in die tabel, en lezen en wijzigen gegevens in die tabel.

voor deze handleiding zullen we voornamelijk werken met een inventaris van vissen die we moeten aanpassen als vissen worden toegevoegd aan of verwijderd uit een fictief aquarium.

Prerequisites

om het meeste uit deze tutorial te halen, wordt aanbevolen om enige bekendheid te hebben met programmeren in Python en wat basisachtergrond met SQL.,

u kunt deze tutorials bekijken voor de nodige achtergrondinformatie:

  • coderen in Python3
  • Een inleiding tot Queries in MySQL

Stap 1 — Een verbinding maken met een SQLite-Database

wanneer we verbinding maken met een SQLite-database, hebben we toegang tot gegevens die uiteindelijk in een bestand op onze computer zitten. SQLite databases zijn volledig uitgeruste SQL-engines die voor vele doeleinden kunnen worden gebruikt. Voor nu, zullen we een database overwegen die de inventaris van vissen bijhoudt in een fictief aquarium.,

We kunnen verbinding maken met een SQLite database met behulp van de Python sqlite3 module:

import sqlite3connection = sqlite3.connect("aquarium.db")

import sqlite3 geeft ons Python programma toegang tot de sqlite3 module. De functie sqlite3.connect()geeft een Connectionobject terug dat we zullen gebruiken om te interageren met de SQLite database in het bestand aquarium.db. Het bestand aquarium.db wordt automatisch aangemaakt door sqlite3.connect() als aquarium.db nog niet bestaat op onze computer.,

We kunnen nagaan of we succesvol onze connection object met:

print(connection.total_changes)

Als wij deze Python-code, zullen we zien output, zoals:

Output
0

connection.total_changes is het totaal aantal database-de rijen die zijn veranderd door de connection. Omdat we nog geen SQL commando ‘ s hebben uitgevoerd, is 0 total_changes correct.

als we op enig moment vinden dat we deze tutorial opnieuw willen starten, kunnen we het aquarium.db bestand van onze computer verwijderen.,

Opmerking: Het is ook mogelijk om verbinding te maken met een SQLite-database die zich strikt in het geheugen bevindt (en niet in een bestand) door de speciale tekenreeks ":memory:" door te geven aan sqlite3.connect(). Bijvoorbeeld, sqlite3.connect(":memory:"). Een ":memory:" SQLite database zal verdwijnen zodra uw Python programma wordt afgesloten. Dit kan handig zijn als u wilt dat een tijdelijke sandbox om iets uit te proberen in SQLite, en hoeft geen gegevens te blijven bestaan nadat uw programma wordt afgesloten.,

Stap 2-Gegevens toevoegen aan de SQLite-Database

nu we verbonden zijn met de aquarium.db SQLite-database, kunnen we beginnen met het invoegen en lezen van gegevens.

in een SQL-database worden gegevens opgeslagen in tabellen. Tabellen definiëren een reeks kolommen en bevatten 0 of meer rijen met gegevens voor elk van de gedefinieerde kolommen., een tabel met de naam fish dat houdt de volgende gegevens:

naam soort tank_number
Sammy haai 1
Jamie inktvis 7

De fish tabel volgt een waarde voor name, species, en tank_number voor elke vis die in het aquarium., 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()., De "CREATE TABLE fish ..." string is een SQL-instructie die wordt gemaakt van een tabel met de naam fish met de drie kolommen van het eerder beschreven: name type TEXT, soorten van het type TEXT, en tank_number type INTEGER.,

nu we een tabel hebben gemaakt, kunnen we rijen met gegevens erin invoegen:

cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")

we roepen cursor.execute() twee keer: eenmaal om een rij voor de haai in te voegen Sammy In tank 1, en eenmaal om een rij in te voegen voor de inktvis Jamie In Tank 7. "INSERT INTO fish VALUES ..." is een SQL-statement waarmee we rijen aan een tabel kunnen toevoegen.,

In de volgende sectie zullen we een SQL SELECT statement gebruiken om de rijen te inspecteren die we zojuist in onze fish tabel hebben ingevoegd.

Stap 3-Gegevens uit de SQLite-Database inlezen

in Stap 2 hebben we twee rijen toegevoegd aan een SQLite-tabel met de naam fish., Ook halen We die rijen met behulp van een SELECT SQL-instructie:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Als we deze code uitvoeren, zullen we zien output, zoals de volgende:

Output

De cursor.execute() functie wordt uitgevoerd in een SELECT instructie voor het ophalen van waarden voor de name, species, en tank_number kolommen in de fish tabel. fetchall() haalt alle resultaten van de SELECT statement., Als we print(rows) zien we een lijst van twee tupels. Elke tupel heeft drie items; een item voor elke kolom die we hebben geselecteerd uit de fish tabel. De twee tupels hebben de gegevens die we in Stap 2 hebben ingevoegd: een tupel voor Sammy de shark, en een tupel voor Jamie de cuttlefish.,

als we rijen in de fish tabel willen ophalen die overeenkomen met een specifieke set criteria, kunnen we een WHERE clausule gebruiken:

als we dit Uitvoeren, zien we de uitvoer als volgt:

Output

zoals bij het vorige voorbeeld, cursor.execute(<SQL statement>).fetchall() staat ons toe om alle resultaten van een SELECT statement op te halen. DeWHERE clausule in deSELECT statementfilters voor Rijen waar de waarde vanname istarget_fish_name., Merk op dat we ? gebruiken om onze target_fish_name variabele te vervangen door het SELECT statement. We verwachten slechts één rij te matchen, en inderdaad zien we alleen de rij voor Jamie de cuttlefish geretourneerd.

waarschuwing: gebruik nooit Python string operaties om dynamisch een SQL statement string te maken. Het gebruik van Python string operaties om een SQL statement string assembleren maakt u kwetsbaar voor SQL injectie aanvallen. SQL injection attacks kunnen worden gebruikt om gegevens te stelen, te wijzigen of anderszins te wijzigen die zijn opgeslagen in uw database., Gebruik altijd de? plaatshouder in uw SQL-statements om dynamisch waarden van uw Python-programma te vervangen. Geef een tupel van waarden als tweede argument door aan Cursor.execute() om uw waarden aan het SQL-statement te binden. Dit substitutiepatroon wordt hier en in andere delen van deze tutorial ook gedemonstreerd.

Stap 4-Het wijzigen van gegevens in de SQLite-Database

rijen in een SQLite-database kan worden gewijzigd met UPDATE en DELETE SQL-statements.,

laten we bijvoorbeeld zeggen dat Sammy de haai werd verplaatst naar tank nummer 2. We kunnen Sammy ‘ s rij veranderen in de fish tabel om deze verandering weer te geven:

We geven een UPDATE SQL statement om de tank_number van Sammy te veranderen in de nieuwe waarde van 2. DeWHERE clausule in hetUPDATE statement zorgt ervoor dat we alleen de waarde vantank_number wijzigen als een rijname = "Sammy"heeft.,

Als wij de volgende SELECT instructie, kunnen we bevestigen onze update was correct:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Als we dit uitvoeren, zullen we zien output, zoals de volgende:

Output

Merk op dat de rij voor de Sammy heeft nu de waarde van 2 voor haar tank_number kolom.

laten we zeggen dat Sammy de haai in het wild werd vrijgelaten en niet langer in het aquarium werd gehouden., Aangezien Sammy niet langer in het aquarium woont, zou het zinvol zijn om de rij Sammy uit de tabel fish te verwijderen.

Issue a DELETE SQL statement to remove a row:

released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))

we issue a DELETE SQL statement to remove the row for Sammy the shark. DeWHERE clausule in hetDELETE statement zorgt ervoor dat we alleen een Rij verwijderen als die rijname = "Sammy"heeft.,

Als wij de volgende SELECT instructie, kunnen we bevestigen onze verwijdering was correct:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Als we deze code uitvoeren, zullen we zien output, zoals de volgende:

Output

Merk op dat de rij voor de Sammy shark is nu verdwenen, en alleen Jamie cuttlefish blijft.,

Stap 5 — gebruiken met Statements voor automatische opruiming

in deze tutorial hebben we twee primaire objecten gebruikt om te interageren met de "aquarium.db" SQLite database: a Connection object named connection, en a Cursor object genaamd cursor.

op dezelfde manier dat Python-bestanden gesloten moeten worden als we ermee klaar zijn, moeten Connection en Cursor objecten ook gesloten worden als ze niet langer nodig zijn.,

We kunnen een with statement gebruiken om ons te helpen bij het automatisch sluiten van Connection en Cursor objecten:

closing is een gemaksfunctie van de contextlib module. Wanneer een verklaring van with wordt afgesloten, zorgt closing ervoor dat close() wordt aangeroepen op het object dat eraan wordt doorgegeven. De functie closing wordt tweemaal gebruikt in dit voorbeeld., Eenmaal om ervoor te zorgen dat het Connection object geretourneerd door sqlite3.connect() automatisch wordt gesloten, en een tweede keer om ervoor te zorgen dat het Cursor object geretourneerd door connection.cursor() automatisch wordt gesloten.,

als we deze code uitvoeren, zien we de uitvoer als volgt:

Output

aangezien "SELECT 1" een SQL-statement is dat altijd een enkele rij retourneert met een enkele kolom met een waarde van 1, is het zinvol om een enkele tupel te zien met 1 als de enige waarde die door onze code wordt geretourneerd.

conclusie

de sqlite3 module is een krachtig onderdeel van de Python-standaardbibliotheek; het laat ons werken met een volledig uitgeruste SQL-database op schijf zonder extra software te installeren.,

in deze tutorial hebben we geleerd hoe we de sqlite3 module kunnen gebruiken om verbinding te maken met een SQLite database, gegevens aan die database toe te voegen en gegevens in die database te lezen en te wijzigen. Onderweg leerden we ook over de risico ‘ s van SQL-injectieaanvallen en hoe contextlib.closing te gebruiken om close() automatisch aan te roepen op Python-objecten in with statements.

Hier kunnen we meer leren over SQL databases in SQLite vs MySQL vs PostgreSQL: een vergelijking van relationele Database Management systemen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Spring naar toolbar