introduktion
denne tutorial dækker ved hjælp af s .lite i kombination med Pythons s .lite3-interface. S .lite er en enkelt fil relationel database bundtet med de fleste standard Python installerer. SQLite er ofte den teknologi valg for små applikationer, især dem af indlejrede systemer og enheder som telefoner og tablets, smart apparater og instrumenter. Det er dog ikke ualmindeligt at høre det bruges til små til mellemstore applicationseb-og desktop-applikationer.,
Oprettelse af en Database og Foretage Tilslutning
Oprettelse af en ny SQLite-database er så simpelt som at oprette en forbindelse ved hjælp af den sqlite3-modul i Python standard bibliotek. For at oprette en forbindelse skal du blot sende en filsti til connect(...)
– metoden i s .lite3-modulet, og hvis databasen repræsenteret af filen ikke findes, oprettes der en på den sti.,
import sqlite3con = sqlite3.connect('/path/to/file/db.sqlite3')
du vil opdage, at du i hverdagens databaseprogrammering konstant opretter forbindelser til din database, så det er en god ide at pakke denne enkle forbindelseserklæring ind i en genanvendelig generaliseret funktion.
oprettelse af tabeller
for at oprette databasetabeller skal du have en ID.om strukturen af de data, du er interesseret i at gemme. Der er mange designovervejelser, der går ind i at definere tabellerne i en relationsdatabase, som hele bøger er skrevet om., Jeg vil ikke gå ind i detaljerne i denne praksis og vil i stedet overlade det til læseren at undersøge yderligere.
for at hjælpe med vores diskussion af S .lite-databaseprogrammering med Python vil jeg dog arbejde ud fra den forudsætning, at der skal oprettes en database til en fiktiv boghandel, der allerede har nedenstående data indsamlet om bogsalg.,
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 |
Ved at inspicere disse data er det tydeligt, at det indeholder oplysninger om kunder, produkter og ordrer. Et almindeligt mønster i databasedesign for transaktionssystemer af denne type er at opdele ordrerne i to yderligere tabeller, ordrer og linjeposter (undertiden benævnt ordredetaljer) for at opnå større normalisering.
i en Python-tolk, i samme mappe som db_utils.,Py-modul defineret tidligere, indtast s .l for at oprette kunder og produkter tabeller følger:
ovenstående kode opretter et forbindelsesobjekt og bruger det til at instantiere et markørobjekt. Markørobjektet bruges til at udføre s .l-sætninger på S .lite-databasen.
Med den oprettede markør skrev jeg derefter S .l for at oprette kundetabellen, hvilket gav den en primær nøgle sammen med et for-og efternavn tekstfelt og tildele det til en variabel kaldet customers_sql
., Jeg kalder derefter execute(...)
– metoden for markørobjektet, der passerer det variablen customers_sql
. Jeg opretter derefter et produktbord på en lignende måde.
Du kan søge i tabellen sqlite_master
, en indbygget s .lite-metadatatabel, for at kontrollere, at ovenstående kommandoer var vellykkede.
for at se alle tabellerne i den aktuelt tilsluttede database forespørgslenname
kolonne isqlite_master
tabel, hvortype
er lig med “tabel”.,
til At få et kig på skemaet af tabeller forespørgsel sql
kolonne i samme tabel, hvor type
er stadig “tabel” og name
er lig med “kunder” og/eller “produkter”.
den næste tabel, der skal defineres, er ordretabellen, der knytter kunder til ordrer via en fremmed nøgle og datoen for deres køb. Da S .lite ikke understøtter en faktisk dato/tid datatype (eller dataklasse for at være i overensstemmelse med S .lite-sproget), vil alle datoer blive repræsenteret som tekstværdier.,
den endelige tabel, der skal defineres, er linjeposttabellen, der giver en detaljeret bogføring af produkterne i hver ordre.
indlæsning af dataene
i dette afsnit demonstrerer jeg, hvordan du indsætter vores eksempeldata i de netop oprettede tabeller. Et naturligt startsted ville være at udfylde produktbordet først, fordi vi uden produkter ikke kan have et salg og derfor ikke ville have de udenlandske nøgler til at forholde sig til linjeposter og ordrer., Se på prøve data, jeg kan se, at der er fire produkter:
arbejdsgangen for udførelse INDSÆTTE udsagn er simpelthen:
- oprette Forbindelse til databasen
- Opret en markør objekt
- Skriv en parametriserede indsætte SQL-sætning og gemme den som en variabel
- Ring til execute-metoden på markøren objekt passerer det sql-variabel og de værdier, som en tupel, for at blive indsat i tabellen
i Betragtning af denne generelle oversigt lad os skrive noget mere kode.,ovenstående kode virker sandsynligvis temmelig indlysende, men lad mig diskutere det lidt, da der er nogle vigtige ting, der foregår her. Indsæt sætningen følger standard S .l syntaks bortset fra ?
bit. ?
er faktisk pladsholdere i det, der er kendt som en”parameteriseret forespørgsel”.parametriserede forespørgsler er et vigtigt træk ved stort set alle databasegrænseflader til moderne programmeringssprog på højt niveau, såsom s .lite3-modulet i Python., Denne type forespørgsel tjener til at forbedre effektiviteten af forespørgsler, der gentages flere gange. Måske mere vigtigt, de også desinficere input, der kommer i stedet for ?
pladsholdere, der er vedtaget i løbet af opkald til at udføre metoden for markøren objekt for at forhindre forbryderiske indgange, der fører til SQL-injektion. Følgende er en tegneserie fra den populære xkcd.com blog beskriver farerne ved S .l injektion.
for at udfylde de resterende tabeller vil vi følge et lidt andet mønster for at ændre tingene lidt op., Arbejdsgangen for hver ordre, der er konstateret ved en kombination af kunden første og sidste navn og købsdato, vil være:
- Indsæt ny kunde i tabellen kunder og hente sin primære nøgle-id
- Opret en ordre indlæg, der er baseret på kunde-id og købsdato derefter hente sin primære nøgle-id
- For hvert produkt i den rækkefølge, der bestemmer dens primære nøgle-id og oprette en linjepost indlæg knytte orden og produkt
For at gøre tingene enklere på os selv, lad os gøre et hurtigt kig op af alle vores produkter., For nu skal du ikke bekymre dig for meget om mekanikken i SELECT s .l-sætningen, da vi snart vil afsætte et afsnit til det.
den første ordre blev placeret den 22.februar 1944 af Alan Turing, der købte Introduktion til Kombinatorik for $7,99.
Start med at lave en ny kundepost for Mr. Turing, og bestem derefter hans primære nøgle-id ved at åbne lastrowid
– feltet i markørobjektet.
Vi kan nu oprette en ordreindgang, indsamle den nye ordre-id-værdi og knytte den til en linjepostindgang sammen med det produkt, Mr. Turing bestilte.,
de resterende poster indlæses nøjagtigt det samme bortset fra ordren til Donald Knuth, som vil modtage to linjeposter. Imidlertid råber den gentagne karakter af en sådan opgave behovet for at pakke disse funktionaliteter ind i genanvendelige funktioner. I db_utils.py modul tilføj følgende kode:
a ,h, nu kan vi arbejde med en vis effektivitet!
du skal exit()
din Python-tolk og genindlæse den for at få dine nye funktioner til at blive tilgængelige i tolken.,
Jeg føler mig tvunget til at give et ekstra råd som studerende i Soft .are håndværk. Når du finder dig selv at gøre flere database manipulationer (Indsætter i dette tilfælde) med henblik på at udføre, hvad der faktisk én samlet opgave (dvs., at oprette en ordre) det er bedst at pakke underopgaver (oprettelse af kunde -, ordre -, så line elementer) i en enkelt database transaktion, så kan du enten forpligte sig på succes eller rollback hvis der opstår en fejl undervejs.,
Dette ville se sådan ud:
Jeg vil afslutte dette afsnit med en hurtig demonstration af, hvordan du opdaterer en eksisterende post i databasen. Lad os Opdatere guiden til at skrive noveller’ pris til 10.99 (foregår på salg).
>>> update_sql = "UPDATE products SET price = ? WHERE id = ?">>> cur.execute(update_sql, (10.99, 2))
forespørgsler på databasen
generelt er den mest almindelige handling, der udføres på en database, en hentning af nogle af de data, der er gemt i den via en SELECT-sætning. I dette afsnit vil jeg demonstrere, hvordan du bruger s .lite3-grænsefladen til at udføre enkle udvalgte forespørgsler.,
for at udføre en grundlæggende multiro. – forespørgsel i kundetabellen sender du en SELECT-sætning til execute(...)
– metoden for markørobjektet. Herefter kan du gentage resultaterne af forespørgslen ved at kalde fetchall()
– metoden for det samme markørobjekt.
lad os sige, at du i stedet bare vil hente en post fra databasen. Du kan gøre dette ved at skrive en mere specifik forespørgsel, sige Donald Knuth ‘ s id nummer 2, og følge det op ved at kalde fetchone()
metode til markøren på objektet.,
>>> cur.execute("SELECT id, first_name, last_name FROM customers WHERE id = 2")>>> result = cur.fetchone()>>> print(result)(2, 'Donald', 'Knuth')
se, hvordan den enkelte række af hvert resultat er i form af en tupel? Nå, mens tupler er en meget nyttig pythonisk datastruktur til nogle programmeringsbrugssager, finder mange mennesker dem lidt hindrende, når det kommer til opgaven med datahentning. Det sker bare så, at der er en måde at repræsentere dataene på en måde, der måske er mere fleksibel for nogle. Alt hvad du skal gøre er at indstillerow_factory
– metoden for forbindelsesobjektet til noget mere egnet, såsomsqlite3.Row
., Dette giver dig muligheden for at få adgang til de enkelte elementer i en række efter position eller nøgleordsværdi.
Konklusion
I denne artikel, jeg gav en kort demonstration af, hvad jeg mener er de vigtigste funktioner og funktionaliteter i sqlite3 Python interface til letvægts enkelt fil SQLite-database, som kommer pre-samlet med de fleste Python-installationer., Jeg forsøgte også at give et par råd om bedste praksis, når det kommer til databaseprogrammering, men jeg advarer den nye, at indviklingen i databaseprogrammering generelt er en af de mest tilbøjelige til sikkerhedshuller på virksomhedsniveau, og yderligere viden er nødvendig før en sådan virksomhed.