Jak korzystać z modułu sqlite3 w Pythonie 3

autor wybrał Covid-19 Relief Fund, aby otrzymać darowiznę w ramach programu Write for DOnations.

wprowadzenie

SQLite jest samodzielną, opartą na plikach bazą danych SQL. SQLite jest dostarczany w pakiecie z Pythonem i może być używany w dowolnej aplikacji Pythona bez konieczności instalowania dodatkowego oprogramowania.

w tym samouczku przejdziemy przez moduł sqlite3 w Pythonie 3., Utworzymy połączenie z bazą danych SQLite, dodamy tabelę do tej bazy danych, wstawimy dane do tej tabeli oraz odczytamy i zmodyfikujemy dane w tej tabeli.

w tym tutorialu będziemy pracować przede wszystkim z inwentarzem ryb, które musimy zmodyfikować, gdy ryby są dodawane do fikcyjnego akwarium lub usuwane z niego.

wymagania wstępne

aby jak najlepiej wykorzystać ten samouczek, zaleca się znajomość programowania w Pythonie i podstawowe tło z SQL.,

możesz przejrzeć te samouczki, aby uzyskać niezbędne informacje podstawowe:

  • jak kodować w Python3
  • Wprowadzenie do zapytań w MySQL

Krok 1 — Tworzenie połączenia z bazą danych SQLite

kiedy łączymy się z bazą danych SQLite, uzyskujemy dostęp do danych, które ostatecznie znajdują się w pliku na naszym komputerze. Bazy danych SQLite są w pełni funkcjonalnymi silnikami SQL, które mogą być używane do wielu celów. Na razie rozważymy bazę danych, która śledzi inwentaryzację ryb w fikcyjnym akwarium.,

możemy połączyć się z bazą danych SQLite za pomocą Pythonasqlite3moduł:

import sqlite3connection = sqlite3.connect("aquarium.db")

import sqlite3 daje naszemu programowi Pythona dostęp do modułusqlite3. Funkcjasqlite3.connect() zwracaConnection obiekt, którego będziemy używać do interakcji z bazą danych SQLite przechowywaną w plikuaquarium.db. Plikaquarium.db jest tworzony automatycznie przezsqlite3.connect() jeśliaquarium.db nie istnieje już na naszym komputerze.,

możemy zweryfikować, że pomyślnie stworzyliśmy nasz obiekt connection uruchamiając:

print(connection.total_changes)

Jeśli uruchomimy ten kod Pythona, zobaczymy wyjście takie jak:

Output
0

connection.total_changes jest całkowitą liczbą wierszy bazy danych, które zostały zmienione przez connection. Ponieważ nie wykonaliśmy jeszcze żadnych poleceń SQL, 0 total_changes jest poprawne.

Jeśli w dowolnym momencie okaże się, że chcemy ponownie uruchomić ten samouczek, możemy usunąć plikaquarium.db z naszego komputera.,

Uwaga: możliwe jest również połączenie się z bazą danych SQLite, która znajduje się ściśle w pamięci (a nie w pliku), przekazując specjalny łańcuch ":memory:" do sqlite3.connect(). Na przykład sqlite3.connect(":memory:"). ":memory:" baza danych SQLite zniknie, gdy tylko twój program w Pythonie zakończy działanie. Może to być wygodne, jeśli chcesz, aby tymczasowy sandbox wypróbował coś w SQLite i nie musisz utrzymywać żadnych danych po zakończeniu programu.,

Krok 2 — Dodawanie danych do bazy danych SQLite

teraz po podłączeniu do bazy danychaquarium.db SQLite możemy zacząć wstawiać i odczytywać dane z niej.

w bazie danych SQL dane są przechowywane w tabelach. Tabele definiują zestaw kolumn i zawierają 0 lub więcej wierszy z danymi dla każdej z zdefiniowanych kolumn., tabela o nazwie fish, która śledzi następujące dane:

nazwa gatunki tank_number
Sammy Shark 1
jamie mątwy 7

tabela fish będzie śledzić wartość dla name, species I tank_number dla każdej ryby w akwarium., 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()., Ciąg "CREATE TABLE fish ..." jest instrukcją SQL, która tworzy tabelę o nazwie fish z trzema kolumnami opisanymi wcześniej: name typu TEXT, gatunku typu TEXT oraz tank_number typu INTEGER.,

teraz, gdy stworzyliśmy tabelę, możemy wstawić do niej wiersze danych:

cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")

wywołujemy cursor.execute() dwa razy: raz wstawiamy wiersz dla rekina Sammy w zbiorniku 1 I raz wstawić wiersz dla mątwy Jamie w zbiorniku 7. "INSERT INTO fish VALUES ..." jest instrukcją SQL, która pozwala nam dodawać wiersze do tabeli.,

w następnej sekcji użyjemy instrukcji SQL SELECT, aby sprawdzić wiersze, które właśnie wstawiliśmy do naszej tabeli fish.

Krok 3-odczyt danych z bazy danych SQLite

w Kroku 2 dodaliśmy dwa wiersze do tabeli SQLite o nazwie fish., Możemy pobrać te wiersze używając SELECT polecenie SQL:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Jeśli uruchomimy ten kod, zobaczymy następujące wyjście:

Output

cursor.execute() funkcja uruchamia instrukcję SELECT, aby pobrać wartości dla name, species I tank_number w tabeli fish. fetchall() pobiera wszystkie wyniki SELECT., Gdy print(rows) widzimy listę dwóch krotek. Każda krotka ma trzy wpisy; jeden wpis dla każdej kolumny wybraliśmy z tabeli fish. Dwie krotki zawierają dane, które wstawiliśmy w Kroku 2: jedną krotkę dla Sammy shark I jedną krotkę dla Jamie cuttlefish.,

jeśli chcemy pobrać wiersze w tabeli fish, które pasują do określonego zestawu kryteriów, możemy użyć WHERE klauzula:

Jeśli to uruchomimy, zobaczymy wyjście w następujący sposób:

Output

jak w poprzednim przykładzie przykład, cursor.execute(<SQL statement>).fetchall() pozwala nam pobrać wszystkie wyniki instrukcji SELECT. WHERE klauzula w filtrach instrukcjiSELECT dla wierszy, w których wartośćname wynositarget_fish_name., Zauważ, że używamy ? aby zastąpić naszą zmienną target_fish_name w instrukcji SELECT. Spodziewamy się dopasować tylko jeden wiersz i rzeczywiście widzimy tylko wiersz dla Jamie cuttlefish zwrócony.

Ostrzeżenie: nigdy nie używaj operacji ciągów Pythona do dynamicznego tworzenia ciągu instrukcji SQL. Korzystanie z operacji ciągów Pythona do złożenia ciągu instrukcji SQL pozostawia cię podatnym na ataki SQL injection. Ataki SQL injection mogą być używane do kradzieży, zmiany lub innej modyfikacji danych przechowywanych w bazie danych., Zawsze używaj symbolu zastępczego ? w poleceniach SQL, aby dynamicznie zastępować wartości z programu Pythona. Przekaż krotkę wartości jako drugi argument do Cursor.execute(), aby powiązać wartości z instrukcją SQL. Ten wzór zastępowania jest pokazany tutaj i w innych częściach tego samouczka.

Krok 4 — modyfikowanie danych w bazie danych SQLite

wiersze w bazie danych SQLite można modyfikować za pomocąUPDATE IDELETE instrukcji SQL.,

Załóżmy na przykład, że rekin Sammy został przeniesiony do czołgu nr 2. Możemy zmienić wiersz w tabeli fish aby odzwierciedlić tę zmianę:

wydajemy polecenie UPDATE SQL, aby zmienić tank_number Sammy na nową wartość 2. WHERE klauzula wUPDATE gwarantuje, że zmieniamy wartośćtank_number tylko wtedy, gdy wiersz maname = "Sammy".,

Jeśli uruchomimy następujące SELECT, możemy potwierdzić, że nasza aktualizacja została wykonana poprawnie:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Jeśli uruchomimy to, zobaczymy wyjście w następujący sposób:

Output

zauważ, że wiersz dla Sammy ma teraz wartość 2 dla swojej kolumny tank_number.

Załóżmy, że rekin Sammy został wypuszczony na wolność i nie jest już trzymany przez Akwarium., Ponieważ Sammy nie mieszka już w akwarium, sensowne byłoby usunięcie wiersza Sammy z tabeli fish.

Wydanie DELETE polecenie SQL, aby usunąć wiersz:

released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))

Wydanie DELETE polecenie SQL, aby usunąć wiersz dla Sammy div id=”e437841f51″>. WHERE klauzula wDELETE gwarantuje, że usuniemy wiersz tylko wtedy, gdy ten wiersz maname = "Sammy".,

Jeśli uruchomimy następująceSELECToświadczenie, możemy potwierdzić, że nasze usunięcie zostało wykonane poprawnie:

rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

Jeśli uruchomimy ten kod, zobaczymy wyjście w następujący sposób:

Output

zauważ, że wiersz dlaSammyshark już nie ma, a tylkoJamiecuttlefish pozostaje.,

Krok 5 — korzystanie z poleceń do automatycznego czyszczenia

w tym samouczku użyliśmy dwóch podstawowych obiektów do interakcji z bazą danych "aquarium.db" SQLite: a Connection obiekt o nazwie connection I Cursor obiekt o nazwie cursor.

w ten sam sposób, w jaki pliki Pythona powinny być zamykane po zakończeniu pracy z nimi, ConnectionI Cursor obiekty powinny być zamykane, gdy nie są już potrzebne.,

możemy użyć with oświadczenie, aby pomóc nam automatycznie zamknąć Connection I Cursor obiekty:

closing jest funkcją wygodną dostarczaną przez contextlib moduł. Gdy poleceniewith kończy działanie,closing zapewnia, żeclose() jest wywołane na dowolnym obiekcie przekazanym do niego. Funkcja closing jest używana dwukrotnie w tym przykładzie., Jeden raz, aby upewnić się, że obiekt Connection zwracany przez sqlite3.connect()jest automatycznie zamykany, a drugi raz, aby upewnić się, że obiekt Cursorzwracany przez connection.cursor() jest automatycznie zamykany.,

Jeśli uruchomimy ten kod, zobaczymy następujące wyjście:

Output

ponieważ "SELECT 1" jest instrukcją SQL, która zawsze Zwraca pojedynczy wiersz z pojedynczą kolumną o wartości 1, warto zobaczyć pojedynczą krotkę z 1 div id = „15fe2053d8” > jako jego jedyna wartość zwracana przez nasz kod.

podsumowanie

modułsqlite3 jest potężną częścią standardowej biblioteki Pythona; pozwala nam pracować z w pełni funkcjonalną bazą danych SQL na dysku bez instalowania dodatkowego oprogramowania.,

w tym samouczku dowiedzieliśmy się, jak używać modułu sqlite3 do łączenia się z bazą danych SQLite, dodawania danych do tej bazy, a także odczytywania i modyfikowania danych w tej bazie danych. Po drodze dowiedzieliśmy się również o ryzyku związanym z atakami SQL injection i jak używać contextlib.closing do automatycznego wywoływania close() na obiektach Pythona w with instrukcji.

stąd możemy dowiedzieć się więcej o bazach danych SQL w SQLite vs MySQL vs PostgreSQL: porównanie relacyjnych systemów zarządzania bazami danych.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Przejdź do paska narzędzi