autorul a selectat fondul de ajutor COVID-19 pentru a primi o donație ca parte a programului Write for DOnations.
Introducere
SQLite este o bază de date SQL bazată pe fișiere. SQLite vine la pachet cu Python și poate fi utilizat în oricare dintre aplicațiile Python fără a fi nevoie să instalați orice software suplimentar.
în acest tutorial, vom parcurge modulul sqlite3
din Python 3., Vom crea o conexiune la o bază de date SQLite, vom adăuga un tabel la acea bază de date, vom introduce date în acel tabel și vom citi și modifica datele din acel tabel.
pentru acest tutorial, vom lucra în primul rând cu un inventar de pești pe care trebuie să-l modificăm pe măsură ce peștii sunt adăugați sau eliminați dintr-un acvariu fictiv.
cerințe preliminare
pentru a profita la maximum de acest tutorial, este recomandat să aveți o anumită familiaritate cu programarea în Python și un fundal de bază cu SQL.,
puteți revizui aceste tutoriale pentru informațiile de bază necesare:
- cum să cod în Python3
- o introducere la interogări în MySQL
Pasul 1 — Crearea unei conexiuni la o bază de date SQLite
când ne conectăm la o bază de date SQLite, accesăm date care în cele din urmă se află într-un fișier de pe computerul nostru. Bazele de date SQLite sunt motoare SQL complet echipate care pot fi utilizate în mai multe scopuri. Deocamdată, vom lua în considerare o bază de date care urmărește inventarul peștilor la un acvariu fictiv.,
Ne putem conecta la o bază de date SQLite folosind Python sqlite3
modul:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
ne dă program in Python acces la sqlite3
module. sqlite3.connect()
funcția returnează un Connection
obiect care le va folosi pentru a interacționa cu baza de date SQLite a avut loc în fișierul aquarium.db
. aquarium.db
fișier este creat în mod automat de către sqlite3.connect()
dacă aquarium.db
nu există deja pe calculatorul nostru.,
putem verifica dacă am creat cu succes noastră connection
obiect de funcționare:
print(connection.total_changes)
Dacă vom rula acest cod Python, vom vedea de ieșire, cum ar fi:
Output0
connection.total_changes
este numărul total de rânduri de date care au fost modificate prin connection
. Deoarece nu am executat încă nicio comandă SQL, 0 total_changes
este corect.dacă, în orice moment, găsim că dorim să începem din nou acest tutorial, putem șterge fișierul aquarium.db
din computerul nostru.,
Notă: de asemenea, este posibil să se conecteze la o bază de date SQLite care se află strict în memorie (și nu într-un fișier) prin trecerea speciale string ":memory:"
în sqlite3.connect()
. De exemplu, sqlite3.connect(":memory:")
. O bază de date ":memory:"
SQLite va dispărea imediat ce programul dvs. Acest lucru ar putea fi convenabil dacă doriți ca o cutie de nisip temporară să încerce ceva în SQLite și nu trebuie să persiste date după ieșirea programului.,
Pasul 2 — adăugarea datelor în baza de date SQLite
acum că ne-am conectat la baza de dateaquarium.db
SQLite, putem începe introducerea și citirea datelor din ea.
într-o bază de date SQL, datele sunt stocate în tabele. Tabelele definesc un set de coloane și conțin 0 sau mai multe rânduri cu date pentru fiecare dintre coloanele definite., un tabel numit fish
care urmărește următoarele date:
nume | specii | tank_number |
---|---|---|
Sammy | rechin | 1 |
Jamie | sepie | 7 |
fish
masa va urmări o valoare pentru name
, species
și tank_number
pentru fiecare pește în acvariu., 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 ..."
string este o instrucțiune SQL care creează un tabel numit fish
cu trei coloane descris mai devreme: name
de tip TEXT
, specii de tip TEXT
, și tank_number
de tip INTEGER
.,
Acum că am creat un tabel, putem introduce rânduri de date în ea:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Noi numim cursor.execute()
de două ori: o dată pentru a introduce un rând pentru rechin Sammy
rezervor 1
, și o dată pentru a introduce un rând de sepie Jamie
rezervor 7
. "INSERT INTO fish VALUES ..."
este o instrucțiune SQL care ne permite să adăugăm rânduri într-un tabel.,
În secțiunea următoare, vom folosi un SQL SELECT
declarație pentru a inspecta rânduri ne-am introdus în fish
masă.
Pasul 3-citirea datelor din Baza de date SQLite
în pasul 2, am adăugat două rânduri într-un tabel SQLite numit fish
., Putem prelua aceste rânduri, folosind un SELECT
SQL:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Dacă vom rula acest cod, vom vedea de ieșire, cum ar fi următoarele:
Output
cursor.execute()
funcția ruleaza un SELECT
declarație pentru a prelua valorile pentru name
, species
, și tank_number
coloane în fish
masă. fetchall()
preia toate rezultatele SELECT
declarație., Când print(rows)
vedem o listă de două tupluri. Fiecare tuplu are trei intrări; o intrare pentru fiecare coloană pe care am selectat-o din tabelul fish
. Cele două tupluri au date am introdus-o la Pasul 2: un tuplu pentru Sammy
shark
, și un singur tuplu pentru Jamie
cuttlefish
.,
Dacă am vrut pentru a prelua rânduri în fish
masa care se potrivesc cu un anumit set de criterii, putem folosi un WHERE
clauză:
Dacă vom rula acest lucru, vom vedea de ieșire, cum ar fi următoarele:
Output
la fel Ca exemplul anterior, cursor.execute(<SQL statement>).fetchall()
ne permite pentru a prelua toate rezultatele de un SELECT
declarație. WHERE
clauză în SELECT
declarație filtre pentru rândurile în care valoarea de name
este target_fish_name
., Observați că vom folosi ?
pentru a înlocui noastre target_fish_name
variabilă în SELECT
declarație. Ne așteptăm să se potrivească doar un rând, și într-adevăr vom vedea doar rândul pentru Jamie
cuttlefish
returnat.
atenție: nu utilizați niciodată operații de șir Python pentru a crea dinamic un șir de instrucțiuni SQL. Utilizarea operațiunilor de șir Python pentru a asambla un șir de instrucțiuni SQL vă lasă vulnerabil la atacurile de injecție SQL. Atacurile SQL injection pot fi folosite pentru a fura, modifica sau modifica în alt mod datele stocate în baza de date., Utilizați întotdeauna substituentul?
în instrucțiunile SQL pentru a înlocui dinamic valorile din programul Python. Treceți un tuplu de valori ca al doilea argument la Cursor.execute()
pentru a vă lega valorile la instrucțiunea SQL. Acest model de substituție este demonstrat aici și în alte părți ale acestui tutorial, de asemenea.
Pasul 4 — Modificarea Datelor în baza de Date SQLite
Rânduri într-o bază de date SQLite poate fi modificat folosind UPDATE
și DELETE
SQL.,să spunem, de exemplu, că Sammy rechinul a fost mutat în rezervorul numărul 2. Putem schimba Sammy rând în fish
masa pentru a reflecta această modificare:
emite un UPDATE
SQL pentru a modifica tank_number
de Sammy
la noua valoare de 2
. WHERE
clauză în UPDATE
declarație asigură vom schimba doar valoarea tank_number
dacă un rând are name = "Sammy"
.,
Dacă vom rula următoarele SELECT
declarație, putem confirma noastră actualizare a fost făcută în mod corect:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Dacă vom rula acest lucru, vom vedea de ieșire, cum ar fi următoarele:
Output
Observați că rând pentru Sammy
acum are valoarea de 2
pentru tank_number
coloana.să spunem că Sammy rechinul a fost eliberat în sălbăticie și nu mai este ținut de acvariu., Deoarece Sammy nu mai locuiește la acvariu, ar avea sens să eliminați rândul Sammy
din tabelul fish
.
Emite un DELETE
SQL pentru a elimina un rând:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
Vom emite un DELETE
SQL pentru a elimina rând pentru Sammy
shark
. WHERE
clauză în DELETE
declarație, ne asigură doar șterge un rând în cazul în care rând are name = "Sammy"
.,
Dacă vom rula următoarele SELECT
declarație, putem confirma ștergerea a fost făcut în mod corect:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Dacă vom rula acest cod, vom vedea de ieșire, cum ar fi următoarele:
Output
Observați că rând pentru Sammy
shark
este acum plecat, și doar Jamie
cuttlefish
rămâne.,
Pasul 5 — Utilizarea cu Declarații Pentru Curatare Automata
In acest tutorial, am folosit două primară obiecte pentru a interacționa cu "aquarium.db"
baza de date SQLite: un Connection
obiect numit connection
, și un Cursor
obiect numit cursor
.
în același mod În care Python fișiere ar trebui să fie închise atunci când am terminat de lucru cu ei, Connection
și Cursor
obiecte ar trebui să fie, de asemenea, închisă atunci când acestea nu mai sunt necesare.,
putem folosi un with
declarație pentru a ne ajuta în mod automat aproape Connection
și Cursor
obiecte:
closing
este o funcție de confort oferit de contextlib
module. Atunci când un with
declarație ieșirile, closing
asigură că close()
este numit pe orice obiect este trecut la ea. Funcția closing
este utilizată de două ori în acest exemplu., O dată pentru a se asigura că Connection
obiectul returnat de sqlite3.connect()
este închisă în mod automat, și un al doilea timp pentru a se asigura că Cursor
obiectul returnat de connection.cursor()
este închis automat.,
Dacă vom rula acest cod, vom vedea de ieșire, cum ar fi următoarele:
Output
Deoarece "SELECT 1"
este o instrucțiune SQL care returnează întotdeauna un singur rând, cu o singură coloană, cu o valoare de 1
, se face sens pentru a vedea un singur tuplu cu 1
ca sa numai valoarea returnată de codul nostru.
concluzie
sqlite3
modulul este o parte puternică a Bibliotecii standard Python; ne permite să lucrăm cu o bază de date SQL complet echipată pe disc fără a instala software suplimentar.,
In acest tutorial, am învățat cum să utilizați sqlite3
modul de a se conecta la o bază de date SQLite, adăugați date la baza de date, precum și de citit și de a modifica datele din baza de date. De-a lungul drum, ne-am învățat, de asemenea, cu privire la riscurile de atacuri SQL injection și cum să utilizați contextlib.closing
pentru a apela în mod automat close()
pe Python obiecte în with
declarații.de aici putem afla mai multe despre bazele de date SQL în Sqlite vs MySQL vs PostgreSQL: o comparație a sistemelor relaționale de gestionare a bazelor de date.