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 Connection
object 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:
Output0
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.