författaren valde Covid-19-hjälpfonden för att få en donation som en del av skrivprogrammet för donationer.
introduktion
SQLite är en fristående, filbaserad SQL-databas. SQLite levereras med Python och kan användas i någon av dina Python-program utan att behöva installera någon ytterligare programvara.
i den här handledningen går vi igenom sqlite3
– modulen i Python 3., Vi skapar en anslutning till en SQLite-databas, lägger till en tabell i den databasen, lägger in data i den tabellen och läser och ändrar data i den tabellen.
för denna handledning kommer vi att arbeta främst med en inventering av fisk som vi behöver ändra som fisk läggs till eller tas bort från en fiktiv Akvarium.
förutsättningar
för att få ut det mesta av denna handledning rekommenderas det att ha viss kännedom om programmering i Python och någon grundläggande bakgrund med SQL.,
Du kan granska dessa handledning för nödvändig bakgrundsinformation:
- så här kodar du i Python3
- En introduktion till frågor i MySQL
Steg 1 — Skapa en anslutning till en SQLite-databas
När vi ansluter till en SQLite-databas får vi tillgång till data som slutligen finns i en fil på vår dator. SQLite databaser är fullt utrustade SQL-motorer som kan användas för många ändamål. För nu ska vi överväga en databas som spårar inventeringen av fisk på ett fiktivt Akvarium.,
vi kan ansluta till en SQLite databas med hjälp av Pythonsqlite3
modul:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
ger vår Python programåtkomst till sqlite3
modul. Funktionensqlite3.connect()
returnerar ettConnection
– objekt som vi kommer att använda för att interagera med SQLite-databasen som finns i filenaquarium.db
. Filenaquarium.db
skapas automatiskt avsqlite3.connect()
omaquarium.db
inte redan finns på vår dator.,
Vi kan verifiera att vi framgångsrikt har skapat vårt connection
– objekt genom att köra:
print(connection.total_changes)
om vi kör denna Python-kod kommer vi att se utdata som:
Output0
connection.total_changes
är det totala antalet databasrader som har ändrats av connection
. Eftersom vi inte har utfört några SQL-kommandon ännu är 0 total_changes
korrekt.
om vi när som helst upptäcker att vi vill starta den här handledningen igen kan vi ta bort filenaquarium.db
från vår dator.,
Obs! Det är också möjligt att ansluta till en SQLite-databas som är strikt i minnet (och inte i en fil) genom att skicka den speciella strängen ":memory:"
till sqlite3.connect()
. Till exempel sqlite3.connect(":memory:")
. En":memory:"
SQLite-databas kommer att försvinna så snart Ditt Python-program går ut. Det här kan vara bekvämt om du vill ha en tillfällig sandlåda för att prova något i SQLite, och behöver inte fortsätta med några data efter att ditt program har gått ut.,
steg 2-Lägga till Data i SQLite-databasen
Nu när vi har anslutit tillaquarium.db
SQLite-databasen kan vi börja infoga och läsa data från den.
i en SQL-databas lagras data i tabeller. Tabeller definierar en uppsättning kolumner och innehåller 0 eller fler rader med data för var och en av de definierade kolumnerna., en tabell med namnet fish
som spårar följande data:
namn | Art | tank_number |
---|---|---|
Sammy | Shark | 1 |
Jamie | bläckfisk | 7 |
fish
tabellen spårar ett värde för name
, species
och tank_number
för varje 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 ..."
strängen är en SQL-sats som skapar en tabell med namnet fish
med de tre kolumnerna som beskrivits tidigare: name
av typen TEXT
, arter av typen TEXT
och tank_number
TEXT
.,
nu när vi har skapat en tabell kan vi infoga rader med data i den:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
vi kallar cursor.execute()
två gånger: en gång för att infoga en rad för hajen Sammy
I tanken 1
, och en gång för att infoga en rad för bläckfisk Jamie
I tank 7
. "INSERT INTO fish VALUES ..."
är en SQL-sats som tillåter oss att lägga till rader i en tabell.,
i nästa avsnitt kommer vi att använda en SQL SELECT
– sats för att inspektera de rader vi just har infogat i tabellen fish
.
steg 3-läsning av data från SQLite-databasen
i steg 2 lade vi till två rader i en SQLite-tabell med namnet fish
., Vi kan hämta dessa rader med hjälp av en SELECT
SQL-sats:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
om vi kör den här koden kommer vi att se utdata som följande:
Output
funktionen cursor.execute()
körs en SELECT
,species
ochtank_number
– kolumnerna i tabellenfish
. fetchall()
hämtar alla resultat frånSELECT
– satsen., När vi print(rows)
ser vi en lista med två tuples. Varje tupel har tre poster; en post för varje kolumn vi valt från tabellenfish
. De två tuplarna har de data som vi infogade i steg 2: en tuple för Sammy
shark
och en tuple för Jamie
cuttlefish
.,
om vi ville hämta rader i fish
– tabellen som matchar en specifik uppsättning kriterier kan vi använda en WHERE
– klausul:
om vi kör detta kommer vi att se utdata som följande:
Output
som med föregående exempel, cursor.execute(<SQL statement>).fetchall()
tillåter oss att hämta alla resultat från ett SELECT
– uttalande. SatsenWHERE
I satsenSELECT
filter för rader där värdet påname
ärtarget_fish_name
., Observera att vi använder ?
för att ersätta vår target_fish_name
variabel i SELECT
uttalande. Vi förväntar oss att bara matcha en rad, och vi ser faktiskt bara raden förJamie
cuttlefish
tillbaka.
Varning: Använd aldrig Python-strängoperationer för att dynamiskt skapa en SQL-satssträng. Använda Python strängoperationer för att montera en SQL-satssträng lämnar dig sårbar för SQL-injiceringsattacker. SQL injection attacker kan användas för att stjäla, ändra eller på annat sätt ändra data som lagras i din databas., Använd alltid platshållaren?
I dina SQL-satser för att dynamiskt ersätta värden från ditt Python-program. Skicka en tupel av värden som det andra argumentet tillCursor.execute()
för att binda dina värden till SQL-satsen. Detta substitutionsmönster demonstreras här och i andra delar av denna handledning också.
steg 4 — Ändra Data i SQLite-databasen
rader i en SQLite-databas kan ändras medUPDATE
ochDELETE
SQL-satser.,
låt oss till exempel säga att Sammy hajen flyttades till tanknummer 2. Vi kan ändra Sammys rad i tabellen fish
för att återspegla denna ändring:
Vi utfärdar en UPDATE
SQL-sats för att ändra tank_number
av Sammy
till dess nya värde av 2
. WHERE
– klausulen iUPDATE
– satsen säkerställer att vi bara ändrar värdet påtank_number
om en rad harname = "Sammy"
.,
om vi kör följande SELECT
uttalande, kan vi bekräfta vår uppdatering gjordes korrekt:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
om vi kör detta, kommer vi att se ut som följande:
Output
Observera att raden för Sammy
nu har värdet 2
för dess tank_number
kolumn.
låt oss säga att Sammy hajen släpptes i naturen och inte längre hölls av akvariet., Eftersom Sammy inte längre bor på akvariet skulle det vara meningsfullt att ta bort Sammy
– raden från tabellen fish
.
utfärda enDELETE
SQL-sats för att ta bort en rad:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
Vi utfärdar enDELETE
SQL-sats för att ta bort raden förSammy
shark
. WHERE
– klausulen iDELETE
– satsen säkerställer att vi bara tar bort en rad om den raden harname = "Sammy"
.,
om vi kör följandeSELECT
– uttalande kan vi bekräfta att vår radering gjordes korrekt:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
om vi kör den här koden kommer vi att se utdata som följande:
Output
Lägg märke till att raden förSammy
shark
är nu borta, och endastJamie
cuttlefish
kvarstår.,
Steg 5 — använda med uttalanden för automatisk rensning
i den här handledningen har vi använt två primära objekt för att interagera med"aquarium.db"
SQLite database: aConnection
objekt som heterconnection
och ettCursor
objekt som heter.
På samma sätt som Python-filer ska stängas när vi är färdiga med dem, ska Connection
och Cursor
objekt också stängas när de inte längre behövs.,
vi kan använda ettwith
uttalande för att hjälpa oss att automatiskt stängaConnection
ochCursor
objekt:
closing
är en bekvämlighetsfunktion som tillhandahålls avcontextlib
modulen. När ett with
– uttalande avslutas, säkerställer closing
att close()
anropas på vilket objekt som än skickas till det. Funktionenclosing
används två gånger i det här exemplet., En gång för att säkerställa attConnection
– objektet returneras avsqlite3.connect()
stängs automatiskt och en andra gång för att säkerställa attCursor
– objektet returneras avconnection.cursor()
stängs automatiskt.,
om vi kör den här koden kommer vi att se utdata som följande:
Output
eftersom"SELECT 1"
är en SQL-sats som alltid returnerar en enda rad med en enda kolumn med ett värde på1
är det vettigt att se en enda tupel med1
slutsats
sqlite3
modulen är en kraftfull del av Python standardbiblioteket; det låter oss arbeta med en fullt utrustad SQL-databas på disken utan att installera någon ytterligare programvara.,
i den här handledningen lärde vi oss hur du använder modulensqlite3
för att ansluta till en SQLite-databas, lägga till data i den databasen, samt läsa och ändra data i den databasen. Längs vägen lärde vi oss också om riskerna med SQL-injiceringsattacker och hur man använder contextlib.closing
för att automatiskt ringa close()
på Pythonobjekt i with
uttalanden.
härifrån kan vi lära oss mer om SQL-databaser i SQLite vs MySQL vs PostgreSQL: en jämförelse av relationsdatabashanteringssystem.