Introducere

acest tutorial va acoperi utilizarea SQLite în combinație cu interfața SQLite3 Python. SQLite este o bază de date relațională cu un singur fișier la pachet cu cele mai multe instalări standard Python. SQLite este adesea tehnologia de alegere pentru aplicații mici, în special cele ale sistemelor și dispozitivelor încorporate, cum ar fi telefoanele și tabletele, aparatele inteligente și instrumentele. Cu toate acestea, nu este neobișnuit să auziți că este folosit pentru aplicații web și desktop mici și medii.,

crearea unei baze de date și crearea unei conexiuni

crearea unei noi baze de date SQLite este la fel de simplă ca crearea unei conexiuni folosind modulul SQLite3 din biblioteca standard Python. Pentru a stabili o conexiune tot ce trebuie să faci este să treacă o cale de fișier la connect(...) metoda în sqlite3 module, și dacă baza de date reprezentată de fișierul nu există, va fi creat la acea cale.,

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

Veți găsi că, în fiecare zi de programare baze de date, veți fi în mod constant crearea de conexiuni la baza de date, așa că este o idee bună pentru a încheia această conexiune simplă declarație într-un reutilizabile generalizate funcție.pentru a crea tabele de baze de date trebuie să aveți o idee despre structura datelor pe care sunteți interesat să le stocați. Există multe considerente de proiectare care intră în definirea tabelelor unei baze de date relaționale, despre care s-au scris cărți întregi., Nu voi intra în detaliile acestei practici și, în schimb, îl voi lăsa pe cititor să investigheze în continuare.

cu toate acestea, pentru a ajuta la discuția noastră despre programarea bazei de date SQLite cu Python, voi lucra de la premisa că trebuie creată o bază de date pentru un magazin de cărți fictiv care are datele de mai jos deja colectate despre vânzările de cărți.,

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

La acest control de date, este evident că acesta conține informații despre clienți, produse și comenzi. Un model comun în proiectarea bazei de date pentru sistemele tranzacționale de acest tip este de a împărți comenzile în două tabele suplimentare, comenzi și elemente de linie (uneori denumite detalii de comandă) pentru a obține o normalizare mai mare.

într-un interpretor Python, în același director ca și db_utils.,py modul definit anterior, introduceți SQL pentru crearea clienților și produse tabele urmează:

codul de mai sus creează un obiect de conexiune, apoi îl folosește pentru a instantia un obiect cursor. Obiectul cursor este utilizat pentru a executa instrucțiuni SQL în baza de date SQLite.

cu cursorul creat am scris apoi SQL pentru a crea tabelul clienți, oferindu-i o cheie primară împreună cu un câmp de text numele și prenumele și atribuiți-l unei variabile numite customers_sql., Apoi sun la metoda execute(...)a obiectului cursorului care trece prin variabila customers_sql. Apoi creez un tabel de produse într-un mod similar.

puteți interoga tabelul sqlite_master, un tabel de metadate SQLite încorporat, pentru a verifica dacă comenzile de mai sus au avut succes.

Pentru a vedea toate tabelele în prezent conectat interogare a bazei de date name coloana de sqlite_master masa unde type este egal cu „masa”.,

Pentru a obține o privire la schema de tabele de interogare sql coloana de aceeași masă unde type este încă „de masă” și name este egal cu „clienții” și/sau „produse”.

următorul tabel de definit va fi tabelul de comenzi care asociază clienții la comenzi printr-o cheie străină și data achiziției lor. Deoarece SQLite nu acceptă un tip de date data/ora reală (sau clasa de date să fie în concordanță cu SQLite vernacular) toate datele vor fi reprezentate ca valori de text.,tabelul final pentru a defini va fi tabelul de elemente rând care oferă o contabilitate detaliată a produselor în fiecare comandă.

încărcarea datelor

În această secțiune voi demonstra cum să inserați datele noastre de probă în tabelele create. Un loc natural de plecare ar fi să populăm mai întâi tabelul de produse, deoarece fără produse nu putem avea o vânzare și, prin urmare, nu am avea cheile străine care să se refere la articolele și comenzile de linie., Privind la datele eșantion văd că există patru produse:

fluxul De lucru pentru executarea INTRODUCE declarații este pur și simplu:

  1. a se Conecta la baza de date
  2. de a Crea un cursor obiect
  3. Scrie un parametrizate introduce declarație SQL și a stoca o variabila
  4. Apel executa metoda pe cursorul obiect trecerea sql variabile și valori, ca un tuplu, pentru a fi introdus în masa

Având în vedere acest cadru general să scrie mai mult cod.,

codul de mai sus, probabil, pare destul de evident, dar permiteți-mi să discutăm un pic, deoarece există unele lucruri importante se întâmplă aici. Instrucțiunea insert urmează sintaxa SQL standard, cu excepția bitului ?. ? sunt de fapt substituenți în ceea ce este cunoscut sub numele de”interogare parametrizată”.interogările parametrizate sunt o caracteristică importantă a tuturor interfețelor bazei de date cu limbajele moderne de programare la nivel înalt, cum ar fi modulul SQLite3 din Python., Acest tip de interogare servește la îmbunătățirea eficienței interogărilor care se repetă de mai multe ori. Poate mai important, ei au, de asemenea, igienizarea intrări, care ia locul ? substituenți care sunt transmise în timpul apelului pentru a executa metoda de cursorul obiect pentru a preveni nefaste intrări care să conducă la SQL injection. Următorul este un comic de la popular xkcd.com blog care descrie pericolele injecției SQL.

pentru a popula tabelele rămase vom urma un model ușor diferit pentru a schimba lucrurile un pic., Fluxul de lucru pentru fiecare comanda, identificată printr-o combinație de client, numele și prenumele și data de cumpărare, va fi:

  1. Introduceți noul client în clienții de masă și de a prelua cheie primară id
  2. Creează o intrare pentru a bazat pe id-ul de client și data de cumpărare și apoi de a prelua cheie primară id
  3. Pentru fiecare produs în scopul de determina cheie primară id-ul și de a crea un element de linie de intrare asociază ordinea și produsul

Pentru a face lucrurile mai simple pe noi înșine să ne facem o privire rapidă în sus de toate produsele noastre., Deocamdată nu vă faceți griji prea mult despre mecanica instrucțiunii select SQL, deoarece îi vom dedica o secțiune în scurt timp.

prima comandă a fost plasată pe 22 februarie 1944 de Alan Turing, care a cumpărat Introduction to Combinatorics pentru $7.99.

începeți prin a face o nouă înregistrare a clientului pentru Domnul Turing, apoi determinați id-ul cheii primare accesând câmpul lastrowid al obiectului cursor.

acum putem crea o intrare de comandă, să colectăm noua valoare a ID-ului comenzii și să o asociem unei intrări de articol rând împreună cu produsul comandat de Domnul Turing.,înregistrările rămase sunt încărcate Exact la fel, cu excepția comenzii făcute lui Donald Knuth, care va primi două intrări de elemente de linie. Cu toate acestea, natura repetitivă a unei astfel de sarcini este nevoia de a înfășura aceste funcționalități în funcții reutilizabile. În db_utils.py modulul adaugă următorul cod:

AW, acum putem lucra cu o anumită eficiență!

va trebui săexit() interpretorul Python și să îl reîncărcați pentru ca noile funcții să devină accesibile în interpretor.,

mă simt obligat să dau un sfat suplimentar ca student al măiestriei software. Când vă aflați făcând mai multe manipulări de baze de date (inserții în acest caz) pentru a realiza ceea ce este de fapt o sarcină cumulativă (adică crearea unei comenzi), cel mai bine este să înfășurați subtascurile (crearea clientului, a comenzii, apoi a articolelor de linie) într-o singură tranzacție de bază de date, astfel încât să puteți fie să vă angajați,

Acest lucru ar arata ceva de genul:

vreau să termin această secțiune cu o demonstrație rapidă a modului de a actualiza o înregistrare existentă în baza de date. Să actualizăm Ghidul pentru scrierea prețului poveștilor scurte la 10.99 (în vânzare).

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

interogarea bazei de date

În general, cea mai comună acțiune efectuată pe o bază de date este o recuperare a unora dintre datele stocate în ea printr-o instrucțiune SELECT. Pentru această secțiune voi demonstra modul de utilizare a interfeței sqlite3 pentru a efectua interogări simple de selectare.,

Pentru a efectua o bază multirow interogare de masa clientilor treci un SELECT la execute(...) metoda de cursorul obiect. După aceasta, puteți itera rezultatele interogării apelând metoda fetchall() a aceluiași obiect cursor.

să spunem că doriți să preluați doar o înregistrare din Baza de date. Puteți face acest lucru scriind o interogare mai specifică, să zicem pentru ID-ul 2 al lui Donald Knuth și urmând acest lucru apelând fetchone() metoda obiectului cursor.,

>>> cur.execute("SELECT id, first_name, last_name FROM customers WHERE id = 2")>>> result = cur.fetchone()>>> print(result)(2, 'Donald', 'Knuth')

vedeți cum rândul individual al fiecărui rezultat este sub forma unui tuplu? Ei bine, în timp ce tuplele sunt o structură de date Pythonică foarte utilă pentru unele cazuri de utilizare a programării, mulți oameni le consideră un pic împiedicând atunci când vine vorba de sarcina de recuperare a datelor. Se întâmplă că există o modalitate de a reprezenta datele într-un mod care este poate mai flexibil pentru unii. Tot ce trebuie să faceți este să setați row_factory metoda de conectare de obiect la ceva mai potrivit, cum ar fi sqlite3.Row., Acest lucru vă va oferi posibilitatea de a accesa elementele individuale ale unui rând după poziție sau valoare de cuvinte cheie.

concluzie

în acest articol am dat o scurtă demonstrație a ceea ce simt sunt cele mai importante caracteristici și funcționalități ale interfeței Python SQLite3 la baza de date ușor SQLite singur fișier care vine pre-bundled cu cele mai multe instalări Python., De asemenea, am încercat să ofer câteva sfaturi cu privire la cele mai bune practici atunci când vine vorba de programarea bazelor de date, dar avertizez noul venit că complexitatea programării bazelor de date este, în general, una dintre cele mai predispuse la găuri de securitate la nivel de întreprindere și sunt necesare cunoștințe suplimentare înainte de o astfel de întreprindere.