Sådan bruges S .lite3-modulet i Python 3

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:

Output
0

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

Videre til værktøjslinje