forfatteren valgt COVID-19 Relief Fund å motta en gave som en del av å Skrive for Donasjoner program.
Innledning
SQLite er en selvstendig, fil-basert SQL database. SQLite kommer sammen med Python, og kan brukes i hvilket som helst av dine Python-programmer uten å installere noen ekstra programvare.
I denne opplæringen vil vi gå gjennom sqlite3
modulen i Python 3., Vi vil opprette en forbindelse til en SQLite database, legge til en tabell som database, setter du inn data i tabellen, og lese og endre data i denne tabellen.
For denne opplæringen, vil vi arbeider først og fremst med en beholdning av fisk at vi trenger å endre fisk som er lagt til eller fjernet fra en fiktiv akvarium.
Forutsetninger
for Å få mest mulig ut av denne opplæringen, er det anbefalt å ha noen kjennskap til programmering i Python og noen grunnleggende bakgrunnen med SQL.,
Du kan se gjennom disse tutorials for nødvendig bakgrunnsinformasjon:
- Hvordan å Kode i Python3
- En Introduksjon til Søk i MySQL
Trinn 1 — Opprette en Tilkobling til en SQLite Database
Når vi kobler til en SQLite database, har vi tilgang til data som til syvende og sist bor i en fil på datamaskinen vår. SQLite databaser er fullt utstyrt SQL-motorer som kan brukes til mange formål. For nå, vil vi vurdere en database som sporer beholdning av fisk på en fiktiv akvarium.,
Vi kan koble til en SQLite database ved hjelp av Python sqlite3
modul:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
gir våre Python-program tilgang til sqlite3
modulen. sqlite3.connect()
funksjon returnerer en Connection
objekt som vi vil bruke til å samhandle med SQLite database holdt i filen aquarium.db
. aquarium.db
fil som opprettes automatisk av sqlite3.connect()
hvis aquarium.db
ikke allerede finnes på datamaskinen vår.,
Vi kan bekrefte at vi opprettet vår connection
objekt ved å kjøre:
print(connection.total_changes)
Hvis vi kjører denne Python-kode, vil vi se utgang som:
Output0
connection.total_changes
er det totale antallet database rader som har blitt endret av connection
. Siden vi har ikke utført noen SQL-kommandoer ennå, 0 total_changes
er riktig.
Hvis, når som helst, vi finner vi ønsker å starte denne opplæringen på nytt, kan vi slett aquarium.db
fil fra datamaskinen vår.,
Merk: Det er også mulig å koble til en SQLite database som ligger strengt i minnet (og ikke i en fil) ved å sende spesielle string ":memory:"
i sqlite3.connect()
. For eksempel, sqlite3.connect(":memory:")
. En ":memory:"
SQLite database vil forsvinne så snart som Python-programmet avslutter. Dette kan være praktisk hvis du ønsker en midlertidig sandkassen for å prøve noe ut i SQLite, og ikke trenger å vedvare noen data etter at programmet avsluttes.,
Trinn 2 — Legge til Data til SQLite Database
Nå som vi har koblet til aquarium.db
SQLite database, kan vi begynne å sette inn og lese data fra den.
I en SQL-database data som er lagret i tabeller. Tabeller definere et sett med kolonner, og inneholder 0 eller flere rader med data for hver av de angitte kolonnene., en tabell som heter fish
som følger med følgende data:
navn | arter | tank_number |
---|---|---|
Sammy | hai | 1 |
Jamie | blekksprut | 7 |
fish
bordet vil spore en verdi for name
, species
, og tank_number
for hver enkelt 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-setning som lager en tabell som heter fish
med de tre kolonnene som er beskrevet tidligere: name
type TEXT
arter av typen TEXT
, og tank_number
type INTEGER
.,
Nå som vi har laget en tabell, kan vi sette inn rader med data inn i det:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Vi kaller cursor.execute()
to ganger: én gang for å sette inn en rad for hai Sammy
i tank 1
, og én gang for å sette inn en rad for blekksprut Jamie
i tank 7
. "INSERT INTO fish VALUES ..."
er en SQL-setning som gjør det mulig for oss å legge til rader i en tabell.,
I neste avsnitt, vil vi bruke en SQL SELECT
statement å inspisere rekker vi akkurat satt inn i våre fish
tabell.
Trinn 3 — Leser Data fra SQLite Database
I Trinn 2, vi har lagt til to rader til en SQLite tabell som heter fish
., Vi kan hente disse rader ved hjelp av en SELECT
SQL-setning:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi kjører denne koden, vil vi se utgang som følgende:
Output
cursor.execute()
– funksjonen kjører en SELECT
erklæringen for å hente ut verdier for name
, species
, og tank_number
kolonner i fish
tabell. fetchall()
henter alle resultatene av SELECT
uttalelse., Når vi print(rows)
vi se en liste over to tupler. Hver tuple har tre oppføringer; en oppføring for hver kolonne har vi valgt fra fish
tabell. De to tupler har de data vi satt inn i Trinn 2: en tuple for Sammy
shark
, og en tuple for Jamie
cuttlefish
.,
Hvis vi ønsket å hente rader i fish
tabell som oppfyller et bestemt sett av kriterier, kan vi bruke en WHERE
klausulen:
Hvis vi kjører dette, vil vi se utgang som følgende:
Output
Som i forrige eksempel, cursor.execute(<SQL statement>).fetchall()
gjør det mulig for oss å hente alle resultatene av en SELECT
uttalelse. WHERE
klausulen i SELECT
uttalelse filtre for rader der verdien av name
er target_fish_name
., Legg merke til at vi bruker ?
for å erstatte vår target_fish_name
variabel i SELECT
uttalelse. Vi forventer å bare matche en rad, og faktisk vi bare se på rad for Jamie
cuttlefish
tilbake.
Advarsel: bruk Aldri Python string operasjoner for å dynamisk lage en SQL-setning strengen. Ved hjelp av Python string operasjoner for å sette sammen en SQL-setning string etterlater deg sårbar for SQL-injection angrep. SQL-injection angrep kan brukes til å stjele, endre eller på annen måte endre data som er lagret i databasen., Bruk alltid ?
plassholder i din SQL-setninger for å dynamisk erstatning verdier fra Python-program. Passere en tuple av verdier som andre argument til Cursor.execute()
for å binde dine verdier i SQL-setningen. Dette substitusjon mønster er vist her og i andre deler av denne opplæringen også.
Trinn 4 — Endre Data i SQLite Database
Rader i en SQLite database kan endres ved hjelp av UPDATE
og DELETE
SQL-setninger.,
La oss si, for eksempel, at Sammy haien ble flyttet til tank nummer 2. Vi kan endre sammys rad i fish
tabell for å reflektere denne endringen:
Vi utstede en UPDATE
SQL-setningen for å endre tank_number
av Sammy
til sin nye verdien av 2
. WHERE
klausulen i UPDATE
uttalelse sikrer at vi bare endre verdien av tank_number
hvis en rad har name = "Sammy"
.,
Hvis vi kjører følgende SELECT
uttalelse, kan vi bekrefte vår oppdateringen ble gjort på riktig måte:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi kjører dette, vil vi se utgang som følgende:
Output
legg Merke til at rad for Sammy
nå har verdien av 2
for sin tank_number
kolonne.
La oss si at Sammy haien var slippes ut i naturen og ikke lenger holdt av akvariet., Siden Sammy ikke lenger bor på akvariet, det ville være fornuftig å fjerne Sammy
rad fra fish
tabell.
Problemet en DELETE
SQL-setningen for å fjerne en rad:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
Vi utstede en DELETE
SQL-setningen for å fjerne raden for Sammy
shark
. WHERE
klausulen i DELETE
uttalelse sikrer at vi bare slette en rad hvis raden har name = "Sammy"
.,
Hvis vi kjører følgende SELECT
uttalelse, kan vi bekrefte vår slettingen ble gjort på riktig måte:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Hvis vi kjører denne koden, vil vi se utgang som følgende:
Output
legg Merke til at rad for Sammy
shark
er nå borte, og bare Jamie
cuttlefish
fortsatt.,
Trinn 5 — Hjelp med regnskapet For Automatisk Opprydding
I denne opplæringen, har vi brukt to ulike objekter for å samhandle med "aquarium.db"
SQLite-database: en Connection
objekt som heter connection
, og en Cursor
objekt som heter cursor
.
På samme måte som Python-filer som skal være stengt når vi er ferdig å jobbe med dem, Connection
og Cursor
objekter bør også være lukket når de ikke lenger trengs.,
Vi kan bruke en with
erklæringen for å hjelpe oss med å lukke seg automatisk Connection
og Cursor
objekter:
closing
er en praktisk funksjon som tilbys av contextlib
modulen. Når en with
uttalelsen kommer ut, closing
sørger for at close()
kalles på det objektet som blir levert til det. closing
funksjon er brukt to ganger i dette eksemplet., Én gang for å sikre at Connection
objektet returnert av sqlite3.connect()
automatisk avsluttet, og en gang til for å sikre at Cursor
objektet returnert av connection.cursor()
automatisk avsluttet.,
Hvis vi kjører denne koden, vil vi se utgang som følgende:
Output
Siden "SELECT 1"
er en SQL-setning som alltid returnerer en enkelt rad med en enkelt kolonne med en verdi på 1
, det er fornuftig å se en eneste tuple med 1
som sin eneste verdien som returneres av våre kode.
Konklusjon
sqlite3
modulen er en kraftig del av Python standard bibliotek; den lar oss jobbe med en fullt kjennetegnet på disken SQL-database uten å installere noen ekstra programvare.,
I denne opplæringen, lærte vi hvordan vi skulle bruke den sqlite3
modulen for å koble til en SQLite database, legge til data til databasen, samt lese og endre data i databasen. Langs veien, vi lærte også om risikoen for SQL-injection angrep, og hvordan du kan bruke contextlib.closing
for å automatisk ringe close()
på Python-objekter i with
uttalelser.
her kan vi lære mer om SQL databaser i SQLite vs MySQL vs PostgreSQL: En Sammenligning Av Relational Database Management Systems.