forfatteren valgte Covid-19-Hjælpefonden til at modtage en donation som en del af Writerite for DOnations-programmet.
introduktion
S .lite er en selvstændig, filbaseret s .l-database. S .lite leveres med Python og kan bruges i nogen af dine Python-applikationer uden at skulle installere yderligere soft .are.
i denne vejledning gennemgår vi sqlite3
modul i Python 3., Vi opretter en forbindelse til en s .lite-database, tilføjer en tabel til den database, indsætter data i den tabel og læser og ændrer data i den tabel.
for denne tutorial arbejder vi primært med en opgørelse over fisk, som vi skal ændre, da fisk tilføjes eller fjernes fra et fiktivt Akvarium.
forudsætninger
for at få mest muligt ud af denne tutorial anbefales det at have en vis fortrolighed med programmering i Python og en grundlæggende baggrund med s .l.,
Du kan gennemgå disse tutorials til den nødvendige baggrundsinformation:
- Hvordan man kan Kode i Python3
- En Introduktion til Forespørgsler i MySQL
Trin 1 — Oprettelse af en Forbindelse til en SQLite-Database
Når vi opretter forbindelse til en SQLite-database, vi har adgang til data, der i sidste ende er bosat i en fil på vores computer. S .lite databaser er fuldt udstyret s .l motorer, der kan bruges til mange formål. For nu vil vi overveje en database, der sporer opgørelsen af fisk på et fiktivt Akvarium.,
Vi kan oprette forbindelse til en SQLite-database ved hjælp af Python sqlite3
modulet:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
giver vores Python program adgang til sqlite3
modul. sqlite3.connect()
funktion returnerer en Connection
objekt, som vi vil bruge til at interagere med SQLite-database, der blev afholdt i filen aquarium.db
. aquarium.db
fil, der er oprettet automatisk af sqlite3.connect()
hvis aquarium.db
ikke allerede findes på vores computer.,
Vi kan bekræfte, at vi har med succes skabt vores connection
objektet ved at køre:
print(connection.total_changes)
Hvis vi kører denne Python kode, vil vi se et output, som:
Output0
connection.total_changes
er det samlede antal af database rækker, der er blevet ændret af connection
. Da vi endnu ikke har udført nogen s .l-kommandoer, er 0 total_changes
korrekt.
Hvis vi til enhver tid finder ud af, at vi vil starte denne tutorial igen, kan vi slette aquarium.db
fil fra vores computer.,
Bemærk: Det er også muligt at oprette forbindelse til en SQLite-database, der er bosat i nøje hukommelse (og ikke i en fil) ved at overføre den specielle streng ":memory:"
i sqlite3.connect()
. For eksempel: sqlite3.connect(":memory:")
. A ":memory:"
s .lite database forsvinder, så snart Dit Python-program afslutter. Dette kan være praktisk, hvis du vil have en midlertidig sandkasse til at prøve noget i s .lite, og behøver ikke at fortsætte nogen data, når dit program afslutter.,
Trin 2 — Tilføjelse af Data til SQLite-Database
Nu, at vi har tilsluttet aquarium.db
SQLite-database, kan vi begynde at indsætte og læse data fra den.
i en s .l-database gemmes data i tabeller. Tabeller definerer et sæt kolonner og indeholder 0 eller flere rækker med data for hver af de definerede kolonner., en tabel, der hedder fish
, der registrerer følgende oplysninger:
navn | arter | tank_number |
---|---|---|
Sammy | haj | 1 |
Jamie | blæksprutte | 7 |
fish
tabel vil spore en værdi for name
species
og tank_number
for hver fisk i akvariet., 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 er en SQL-sætning, der skaber en tabel, der hedder fish
med tre kolonner, der er beskrevet tidligere: name
type TEXT
, arter af typen TEXT
og tank_number
type INTEGER
.,
Nu, at vi har oprettet en tabel, kan vi indsætte rækker af data i det:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Vi kalder cursor.execute()
to gange: én gang for at indsætte en række, for haj Sammy
i tank 1
og én gang for at indsætte en række, til blæksprutte Jamie
i tank 7
. "INSERT INTO fish VALUES ..."
er en s .l-sætning, der giver os mulighed for at tilføje rækker til en tabel.,
I de næste afsnit, vil vi bruge en SQL – SELECT
erklæring for at inspicere de rækker, vi lige har indsat i vores fish
tabel.
Trin 3 — læsning af Data fra S .lite-databasen
i Trin 2 tilføjede vi to rækker til en s .lite-tabel med navnet fish
., Vi kan finde disse rækker ved hjælp af en SELECT
SQL-sætning:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi køre denne kode, vil vi se output som følgende:
Output
cursor.execute()
funktion kører en SELECT
sætning til at hente værdier for name
species
og tank_number
kolonner i fish
tabel. fetchall()
henter alle resultaterne af SELECT
erklæring., Når vi print(rows)
ser vi en liste over to tupler. Hver tupel har tre poster; en post for hver kolonne, vi valgte frafish
tabel. De to elementer har de data, som vi har indsat i Trin 2: en tupel for Sammy
shark
, og en tupel for Jamie
cuttlefish
.,
Hvis vi ønskede at hente rækker i fish
tabel, der opfylder et bestemt sæt af kriterier, kan vi bruge en WHERE
klausul:
Hvis vi kører det, vi vil se et output, som følgende:
Output
Som med det foregående eksempel, cursor.execute(<SQL statement>).fetchall()
giver os mulighed for at hente alle resultaterne af en SELECT
erklæring. WHERE
klausul i SELECT
erklæring filtre for rækker, hvor værdien af name
er target_fish_name
., Bemærk, at vi bruger ?
for at erstatte vores target_fish_name
variabel i SELECT
erklæring. Vi forventer kun at matche en række, og faktisk ser vi kun rækken for Jamie
cuttlefish
returneret.
Advarsel: Brug aldrig Python-strengoperationer til dynamisk at oprette en s .l-sætningsstreng. Brug af Python-strengoperationer til at samle en s .l-sætningsstreng efterlader dig sårbar over for S .l-injektionsangreb. S .l-injektionsangreb kan bruges til at stjæle, ændre eller på anden måde ændre data, der er gemt i din database., Brug altid?
pladsholder i dine s .l-sætninger til dynamisk at erstatte værdier fra dit Python-program. Passere en tupel af værdier, som det andet argument til Cursor.execute()
for at binde dine værdier til SQL-sætning. Dette substitutionsmønster demonstreres også her og i andre dele af denne tutorial.
Trin 4 — Ændre Data i en SQLite-Database
Rækker i en SQLite-database, kan ændres ved hjælp af UPDATE
og DELETE
SQL-sætninger.,lad os sige, at Sammy hajen blev flyttet til tank nummer 2. Vi kan ændre Sammy ‘ s row i fish
tabel for at afspejle denne ændring:
Vi udstede en UPDATE
SQL-sætningen til at ændre tank_number
af Sammy
til dens nye værdi 2
. WHERE
klausul i UPDATE
erklæring, der sikrer, at vi kun ændre værdien af tank_number
hvis en række er name = "Sammy"
.,
Hvis vi kører efter SELECT
erklæring, kan vi bekræfte, at vores opdatering blev foretaget korrekt:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi kører det, vi vil se et output, som følgende:
Output
Bemærk, at rækken for Sammy
nu har den værdi 2
for sin tank_number
kolonne.
lad os sige, at Sammy hajen blev frigivet i naturen og ikke længere holdt af akvariet., Da Sammy ikke længere bor i akvariet, ville det være fornuftigt at fjerne Sammy
række fra fish
tabel.
Problem DELETE
SQL-sætning til at fjerne en række:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
Vi udstede en DELETE
SQL-sætning til at fjerne rækken for Sammy
shark
. WHERE
klausul iDELETE
erklæring sikrer, at vi kun sletter en række, hvis den række harname = "Sammy"
.,
Hvis vi kører efter SELECT
erklæring, kan vi bekræfte sletningen var lavet korrekt:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi køre denne kode, vil vi se output som følgende:
Output
Bemærk, at rækken for Sammy
shark
er nu gået, og kun Jamie
cuttlefish
fortsat.,
Trin 5 — Brug med regnskabet For Automatisk Oprydning
I denne tutorial har vi brugt to primære objekter for at interagere med "aquarium.db"
SQLite-database: en Connection
objekt med navnet connection
og en Cursor
objekt med navnet cursor
.
På samme måde som Python-filer skal være lukkede, når vi er færdig med at arbejde med dem, Connection
og Cursor
genstande bør også være lukkede, når de ikke længere er nødvendige.,
Vi kan bruge en with
erklæring for at hjælpe os med automatisk luk Connection
og Cursor
objekter:
closing
er en praktisk funktion, som contextlib
modul. Når en with
erklæring udgange, closing
sikrer, at close()
kaldes på, hvad genstanden er gået til det. Funktionen closing
bruges to gange i dette eksempel., En gang for at sikre, at Connection
objekt, der returneres af sqlite3.connect()
automatisk lukket, og en anden gang for at sikre, at Cursor
objekt, der returneres af connection.cursor()
automatisk lukket.,
Hvis vi køre denne kode, vil vi se output som følgende:
Output
Da "SELECT 1"
er en SQL-sætning, der altid returnerer en enkelt række med en enkelt kolonne med en værdi af 1
det giver mening at se en enkelt tuple med 1
som sin eneste værdi, der returneres af vores kode.
Konklusion
sqlite3
modul er en stærk del af Python standard bibliotek; den lader os arbejde med et fuldt udstyret on-disk SQL-databasen uden at skulle installere ekstra software.,
i denne vejledning lærte vi, hvordan du bruger sqlite3
– modulet til at oprette forbindelse til en s .lite-database, tilføje data til den database samt læse og ændre data i den database. Langs den måde, vi lærte også om risikoen for SQL-injection angreb, og hvordan man bruger contextlib.closing
til automatisk opkald close()
på Python-objekter i with
erklæringer.
her kan vi lære mere om SQL-databaser i SQLite-vs MySQL vs PostgreSQL: En Sammenligning Af Relationelle Database Management Systemer.