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ą Pythonasqlite3
moduł:
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:
Output0
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ąceSELECT
oś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 dlaSammy
shark
już nie ma, a tylkoJamie
cuttlefish
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, Connection
I 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 Cursor
zwracany 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.