introduktion
denna handledning kommer att täcka med SQLite i kombination med Pythons sqlite3-gränssnitt. SQLite är en enda fil relationsdatabas medföljer de flesta vanliga Python installationer. SQLite är ofta den teknik som valts för små applikationer, särskilt de av inbyggda system och enheter som telefoner och surfplattor, smarta apparater och instrument. Det är dock inte ovanligt att höra det som används för små till medelstora webb-och skrivbordsprogram.,
skapa en databas och göra en anslutning
skapa en ny SQLite databas är lika enkelt som att skapa en anslutning med sqlite3 modulen i Python standardbiblioteket. För att upprätta en anslutning behöver du bara skicka en filsökväg tillconnect(...)
– metoden i sqlite3-modulen, och om databasen som representeras av filen inte existerar skapas en på den sökvägen.,
import sqlite3con = sqlite3.connect('/path/to/file/db.sqlite3')
Du kommer att upptäcka att i den dagliga databasprogrammeringen kommer du ständigt att skapa anslutningar till din databas, så det är en bra idé att sätta in detta enkla anslutningsuttalande i en återanvändbar generaliserad funktion.
skapa tabeller
för att skapa databastabeller måste du ha en uppfattning om strukturen för de data du är intresserad av att lagra. Det finns många designhänsyn som går in i att definiera tabellerna i en relationsdatabas, som hela böcker har skrivits om., Jag kommer inte att gå in på detaljerna i denna praxis och kommer istället att lämna det till läsaren att ytterligare undersöka.
för att hjälpa till i vår diskussion om SQLite databasprogrammering med Python kommer jag att arbeta av förutsättningen att en databas måste skapas för en fiktiv bokhandel som har nedanstående data som redan samlats in på bokförsäljning.,
customer | date | product | price |
---|---|---|---|
Alan Turing | 2/22/1944 | Introduction to Combinatorics | 7.99 |
Donald Knuth | 7/3/1967 | A Guide to Writing Short Stories | 17.99 |
Donald Knuth | 7/3/1967 | Data Structures and Algorithms | 11.99 |
Edgar Codd | 1/12/1969 | Advanced Set Theory | 16.,99 |
När du inspekterar dessa data är det uppenbart att det innehåller information om kunder, produkter och beställningar. Ett vanligt mönster i databasdesign för transaktionssystem av denna typ är att bryta orderna i två ytterligare tabeller, order och linjeobjekt (ibland kallade orderdetaljer) för att uppnå större normalisering.
i en Python tolk, i samma katalog som db_utils.,Py modul definieras tidigare, ange SQL för att skapa kunder och produkter tabeller följer:
ovanstående kod skapar en anslutning objekt sedan använder den för att instansiera en markör objekt. Markörobjektet används för att utföra SQL-satser i SQLite-databasen.
med markören skapad skrev jag sedan SQL för att skapa tabellen Kunder, vilket ger den en primär nyckel tillsammans med ett textfält för för-och efternamn och tilldela den till en variabel som heter customers_sql
., Jag kallar sedanexecute(...)
– metoden för markörobjektet som passerar dencustomers_sql
– variabeln. Jag skapar sedan ett produktbord på ett liknande sätt.
Du kan fråga tabellensqlite_master
, en inbyggd metadatatabell för SQLite, för att verifiera att ovanstående kommandon lyckades.
för att se alla tabeller i den för närvarande anslutna databasfråganname
kolumnensqlite_master
tabellen därtype
är lika med ”tabell”.,
för att få en titt på schemat för tabellerna frågasql
kolumnen i samma tabell därtype
fortfarande är ”Tabell” ochname
är lika med ”kunder” och / eller ”produkter”.
nästa tabell för att definiera kommer att vara ordertabellen som associerar kunder till beställningar via en utländsk nyckel och datumet för deras köp. Eftersom SQLite inte stöder en faktisk datum / tid datatyp (eller dataklass för att överensstämma med SQLite vernacular) alla datum kommer att representeras som textvärden.,
den slutliga tabellen för att definiera kommer att vara tabellen radposter som ger en detaljerad redovisning av produkterna i varje ordning.
laddar Data
i det här avsnittet kommer jag att visa hur du infogar våra provdata i de tabeller som just skapats. En naturlig startpunkt skulle vara att fylla tabellen Produkter först eftersom utan produkter vi inte kan ha en försäljning och därmed inte skulle ha utländska nycklar att relatera till raden objekt och beställningar., Om man tittar på exempeldata ser jag att det finns fyra produkter:
arbetsflödet för att exekvera INSERT-satser är helt enkelt:
- Anslut till databasen
- skapa ett markörobjekt
- Skriv en parametriserad insert SQL-sats och lagra som en variabel
- Ring exekveringsmetoden på markörobjektet som passerar den sql-variabeln och värdena, som en tupel, som ska infogas i tabellen
Med tanke på den här allmänna konturen låter vi skriver lite mer kod.,
ovanstående kod verkar förmodligen ganska uppenbart, men låt mig diskutera det lite eftersom det finns några viktiga saker som händer här. Satsen infoga följer standard SQL-syntax förutom bit?
. ?
s är faktiskt platshållare i vad som kallas en ”parametriserad fråga”.
parametriserade frågor är ett viktigt inslag i i huvudsak alla databasgränssnitt till moderna programmeringsspråk på hög nivå, såsom sqlite3-modulen i Python., Denna typ av fråga tjänar till att förbättra effektiviteten hos frågor som upprepas flera gånger. Kanske viktigare, de sanerar också ingångar som tar platsen för?
platshållare som skickas in under samtalet till exekveringsmetoden för markörobjektet för att förhindra skändliga ingångar som leder till SQL-injektion. Följande är en komisk från den populära xkcd.com blogg som beskriver farorna med SQL-injektion.
för att fylla de återstående tabellerna kommer vi att följa ett något annorlunda mönster för att ändra saker lite., Arbetsflödet för varje order, identifierat av en kombination av kundens för-och efternamn och inköpsdatum, kommer att vara:
- sätt in den nya kunden i tabellen Kunder och Hämta dess primära nyckel-id
- skapa en orderpost baserad på kund-id och inköpsdatum sedan Hämta dess primära nyckel-id
- för varje produkt i ordningen bestämma dess primära nyckel-id och skapa en rad post post associerar ordern och produkten
för att göra saker enklare på oss låt oss göra en snabb slå upp alla våra produkter., För nu oroa dig inte för mycket om mekaniken i SELECT SQL-satsen eftersom vi kommer att ägna ett avsnitt till det inom kort.
den första beställningen placerades den 22 februari 1944 av Alan Turing som köpte introduktion till Kombinatorik för $7.99.
börja med att skapa en ny kundpost för Mr Turing och bestäm sedan sitt primära nyckel-id genom att öppna fältet lastrowid
för markörobjektet.
Vi kan nu skapa en orderpost, samla in det nya order-ID-värdet och associera det till en linjepost tillsammans med produkten Mr Turing beställt.,
de återstående posterna laddas exakt samma med undantag för beställningen till Donald Knuth, som kommer att få två radposter. Men den repetitiva karaktären hos en sådan uppgift gråter ut behovet av att sätta in dessa funktioner i återanvändbara funktioner. I db_utils.py modul Lägg till följande kod:
Awh, nu kan vi arbeta med viss effektivitet!
du måsteexit()
din Python tolk och ladda om den för att få dina nya funktioner att bli tillgängliga i tolken.,
Jag känner mig tvungen att ge ytterligare ett råd som student av programvara hantverk. När du befinner dig gör flera databas manipulationer (infogar i detta fall) för att åstadkomma vad som faktiskt är en kumulativ uppgift (dvs skapa en order) är det bäst att linda underrubriker (skapa kund, ordning, sedan radartiklar) i en enda databas transaktion så att du kan antingen begå framgång eller rollback om ett fel inträffar längs vägen.,
det här skulle se ut så här:
Jag vill avsluta det här avsnittet med en snabb demonstration av hur du uppdaterar en befintlig post i databasen. Låt oss uppdatera guiden för att skriva novellernas pris till 10.99 (säljs).
>>> update_sql = "UPDATE products SET price = ? WHERE id = ?">>> cur.execute(update_sql, (10.99, 2))
fråga databasen
i allmänhet är den vanligaste åtgärden som utförs på en databas en hämtning av några av de data som lagras i den via en SELECT-sats. För det här avsnittet kommer jag att visa hur du använder sqlite3-gränssnittet för att utföra enkla utvalda frågor.,
för att utföra en grundläggande multirowfråga i tabellen Kunder skickar du ett SELECT-uttryck till execute(...)
– metoden för markörobjektet. Därefter kan du iterera över resultaten av frågan genom att ringafetchall()
– metoden för samma markörobjekt.
låt oss säga att du istället bara vill hämta en post från databasen. Du kan göra detta genom att skriva en mer specifik fråga, säga för Donald Knuths id för 2, och följa upp det genom att ringa fetchone()
metod för markörobjektet.,
>>> cur.execute("SELECT id, first_name, last_name FROM customers WHERE id = 2")>>> result = cur.fetchone()>>> print(result)(2, 'Donald', 'Knuth')
se hur den enskilda raden i varje resultat är i form av en tuple? Tja, medan tuples är en mycket användbar Pythonisk datastruktur för vissa programmeringsfall, tycker många att de hindrar dem lite när det gäller uppgiften att hämta data. Det råkar vara så att det finns ett sätt att representera data på ett sätt som kanske är mer flexibelt för vissa. Allt du behöver göra är att ställa in metodenrow_factory
för anslutningsobjektet till något mer lämpligt somsqlite3.Row
., Detta ger Dig möjlighet att komma åt de enskilda objekten i en rad efter position eller sökordsvärde.
slutsats
i den här artikeln gav jag en kort demonstration av vad jag känner är de viktigaste funktionerna och funktionerna i sqlite3 Python-gränssnittet till den lätta Enkelfilen SQLite-databasen som levereras i förväg med de flesta Python-installationer., Jag försökte också ge några få råd om bästa praxis när det gäller databasprogrammering, men jag varnar den nykomlingen att invecklingen av databasprogrammering i allmänhet är en av de mest utsatta för säkerhetshål på företagsnivå och ytterligare kunskap är nödvändig före ett sådant företag.