Innledning

Denne opplæringen vil dekke bruker SQLite i kombinasjon med Python ‘ s sqlite3 grensesnitt. SQLite er en enkelt fil relasjonsdatabase sammen med de fleste standard Python installert. SQLite er ofte teknologien av valget for små programmer, spesielt de av embedded systemer og enheter som telefoner og nettbrett, smart-apparater og instrumenter. Imidlertid, det er ikke uvanlig å høre at det er brukt for små og mellomstore web-og desktop-applikasjoner.,

Opprette en Database og Lage en Forbindelse

Opprette en ny SQLite database er så enkelt som å opprette en tilkobling ved å bruke sqlite3 modul i Python standard bibliotek. For å opprette en tilkobling alt du trenger å gjøre er å passere en filbane til connect(...) metode i sqlite3 modul, og hvis databasen representert av filen eksisterer ikke vil bli opprettet på banen.,

import sqlite3con = sqlite3.connect('/path/to/file/db.sqlite3')

Du vil finne at i hverdagen database programmering du vil bli stadig skape forbindelser til databasen din, så det er en god idé å bryte denne enkel tilkobling uttalelse i en gjenbrukbar generalisert funksjon.

Opprette Tabeller

for å lage database-tabellene, må du ha en idé om strukturen på dataene du er interessert i å lagre. Det er mange design hensyn som går inn å definere tabeller av en relasjonsdatabase, som hele bøker har blitt skrevet om., Jeg vil ikke gå inn i detaljene i denne praksisen, og vil i stedet la det opp til leseren å undersøke nærmere.

Imidlertid til hjelp i vår diskusjon av SQLite database-programmering med Python-jeg skal jobbe av den grunn at en database behov for å være opprettet for en fiktiv bestill butikken som har nedenfor data som allerede er samlet inn på boksalg.,

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 undersøker dette data det er tydelig at det inneholder informasjon om kunder, produkter og bestillinger. Et vanlig mønster i database design for transaksjons-systemer av denne typen er å bryte ordrer til to ekstra tabeller, ordrer og linjeelementer (noen ganger referert til som rekkefølgen detaljer) for å oppnå større normalisering.

I en Python-tolkeren, i samme katalog som db_utils.,py-modul som er definert tidligere, skriv inn SQL for oppretting av kunder og produkter bord på følgende måte:

koden ovenfor skaper en forbindelse objekt deretter bruker den til å instantiate en markøren til objektet. Markøren objektet brukes til å utføre SQL-setninger på SQLite database.

Med markøren opprettet jeg skrev da SQL å opprette kunder-tabellen, gir det en primærnøkkel sammen med en for-og etternavn tekst-feltet og tilordne den til en variabel kalt customers_sql., Jeg ringer deretter execute(...) metode for markøren objekt passerer det customers_sql variabel. Jeg oppretter deretter et produkter bord på en lignende måte.

Du kan spørre sqlite_master bordet, en innebygd SQLite metadata bordet, for å kontrollere at over kommandoer var vellykket.

for Å se alle tabellene i den aktive databasen spørringen name kolonne av sqlite_master tabell der type er lik «bordet».,

for Å få en titt på skjemaet av tabeller spørring sql kolonne i samme tabell der type er fortsatt «bordet» og name er lik «kunder» og/eller «produkter».

Den neste tabellen for å definere vil være ordrer-tabellen som knytter kunder bestillinger via en sekundærnøkkel, og datoen for kjøpet. Siden SQLite støtter ikke en aktuell dato/tid datatype (eller data klasse for å være i samsvar med SQLite folkemunne) alle datoer vil bli representert som tekst verdier.,

Det endelige tabellen for å definere vil være artiklene tabell som gir en detaljert regnskap over produktene på hver bestilling.

Lasting av Data

I denne delen vil jeg vise hvordan du SETTER inn vårt eksempel data i tabeller nettopp opprettet. Et naturlig utgangspunkt vil være å fylle produkter tabell første fordi uten produkter vi kan ikke ha et salg, og dermed ikke ville ha fremmednøkler å forholde seg til artiklene og bestillinger., Se på eksempeldata ser jeg at det er fire produkter:

arbeidsflyt for å utføre SETTE inn uttalelser er ganske enkelt:

  1. Koble til database
  2. Opprette en markøren til objektet
  3. Skriv en parameterized sett inn SQL-setningen, og lagre som en variabel
  4. Ring utføre metoden på markøren objekt passerer det sql variable og verdier, som en tuple, å bli satt inn i tabellen

Gitt denne generelle beskrivelsen la oss skrive litt mer kode.,

koden ovenfor sannsynligvis virker ganske opplagt, men la meg ta det litt som det er noen viktige ting som skjer her. Sett inn uttalelse følger standard SQL-syntaks bortsett fra ? bit. ?‘s er faktisk plassholdere i det som er kjent som en «parameterized query».

Parameterized spørsmål er en viktig funksjon av nesten alle database grensesnitt til moderne høyt nivå programmeringsspråk som sqlite3 modul i Python., Denne typen spørring tjener til å forbedre effektiviteten av søkene som blir gjentatt flere ganger. Kanskje mer viktig, de også rense innganger som tar sted i ? plassholdere som er gått i løpet av samtalen til å utføre metoden for markøren objekt for å hindre nefarious innganger fører til SQL-injeksjon. Det følgende er en tegneserie fra den populære xkcd.com blogg som beskriver farene for SQL-injeksjon.

for Å fylle de resterende tabeller vi kommer til å følge et litt annet mønster for å endre ting opp litt., Arbeidsflyten for hver bestilling, identifisert ved en kombinasjon av kunden for-og etternavn og kjøpsdato, vil være:

  1. Sett inn den nye kunde i kunder-tabellen og gjenopprette dens primære nøkkel-id
  2. Opprette en ordre oppføring basert på kunde-id og kjøpsdato og hente dens primære nøkkel-id
  3. For hvert produkt i bestillingen bestemme dens primære nøkkel-id-en og lage en artikkel oppføring knytte bestillingen og produktet

For å gjøre ting enklere på oss selv la oss gjøre en rask titt opp på for alle våre produkter., For nå må du ikke bekymre deg for mye om den tekniske siden av VELG SQL-setning som vi vil vie en del til det snart.

Den første bestillingen ble lagt inn på Feb 22, 1944 av Alan Turing som har kjøpt Introduksjon til Kombinatorikk for $7.99.

Start med å lage en ny kunde-posten for Mr. Turing deretter bestemme sin primære nøkkel-id-en ved å gå inn på lastrowid feltet for markøren objekt.

Vi kan nå opprette en ordre oppføring, samle inn ny ordre-id-verdien og knytte det til en artikkel oppføring sammen med produktet Mr. Turing bestilt.,

De resterende postene er lagt med nøyaktig den samme med unntak for det som er gjort til Donald Knuth, som vil motta to line item oppføringer. Imidlertid, de repeterende en slik oppgave er å gråte ut behovet for å bryte disse funksjonene i gjenbrukbare funksjoner. I db_utils.py modulen legg til følgende kode:

Awh, nå kan vi jobbe med noen effektivitet!

vil Du trenger for å exit() dine Python interpreter, og legg det å få nye funksjoner skal bli tilgjengelige i tolk.,

jeg føler meg tvunget til å gi en ytterligere råd som student i programvare håndverk. Når du finner deg selv å gjøre flere database manipulasjoner (Innlegg i dette tilfellet) for å oppnå det er faktisk en kumulativ oppgave (dvs, å opprette en ordre) er det best å pakke deloppgavene (opprette kunde, ordre, deretter linje elementer) i en enkelt database transaksjonen, slik at du kan enten forplikte seg på suksess eller rollback hvis det oppstår en feil underveis.,

Dette vil se ut noe som dette:

jeg vil avslutte denne delen med en rask demonstrasjon av hvordan du OPPDATERER en eksisterende oppføring i databasen. La oss oppdatere Guide til å Skrive noveller » – prisen til 10.99 (kommer på salg).

>>> update_sql = "UPDATE products SET price = ? WHERE id = ?">>> cur.execute(update_sql, (10.99, 2))

det sendes en Spørring til Databasen

Vanligvis den vanligste handlingen er utført på en database er en henting av noen av de data som er lagret i det via en SELECT-setning. I denne delen vil jeg vise hvordan å bruke sqlite3 grensesnitt for å utføre enkle VELG spørringer.,

for Å utføre en grunnleggende multirow spørring av kunder-tabellen du passerer en SELECT-setning til execute(...) metode for markøren objekt. Etter dette kan iterere over resultatene av spørringen ved å ringe fetchall() metode for samme markøren objekt.

Kan si du ønsker i stedet for å bare hente poster fra databasen. Du kan gjøre dette ved å skrive en mer spesifikk spørring, si for Donald Knuth ‘ s id 2, og følge dette opp ved å ringe fetchone() metode for markøren objekt.,

>>> 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 rad av hvert resultat er i form av en tuple? Godt mens tupler er en svært nyttig Pythonic data struktur for noen programmering bruker tilfeller mange mennesker finner dem litt i veien når det kommer til oppgaven med innhenting av data. Det bare skjer, slik at det er en måte å representere data på en måte som kanskje er mer fleksible for noen. Alt du trenger å gjøre er å sette row_factory metoden for tilkobling objekt til noe mer passende, for eksempel sqlite3.Row., Dette vil gi deg muligheten til å få tilgang til de enkelte elementene i en rad av posisjon eller søkeord verdi.

Konklusjon

I denne artikkel ga jeg en kort demonstrasjon av hva jeg mener er de viktigste funksjonene og funksjonaliteten til sqlite3 Python interface til den lette enkelt fil SQLite database som kommer pre-sammen med de fleste Python installert., Jeg har også prøvd å gi noen biter av råd om beste praksis når det kommer til database-programmering, men jeg gjør forsiktig ny comer til at vanskelighetene med database-programmering er generelt en av de mest tilbøyelige til å sikkerhetshull på organisasjonsnivå, og mer kunnskap er nødvendig før en slik oppgave.