Cum se utilizează modulul SQLite3 în Python 3

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:

Output
0

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Sari la bara de unelte