Hur man använder sqlite3-modulen i Python 3

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 sqlite3ger 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:

Output
0

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 ,speciesochtank_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örJamiecuttlefish 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örSammyshark. 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örSammyshark är nu borta, och endastJamiecuttlefish 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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Hoppa till verktygsfältet