Jestem zupełnie nowy w module sqlite3 w Pythonie (i ogólnie w języku SQL), a to kompletnie mnie przytłacza. Obfity brak opisów cursor
obiektów (a raczej ich konieczności) również wydaje się dziwny.
Ten fragment kodu jest preferowanym sposobem wykonywania czynności:
import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()
Ten nie jest, mimo że działa równie dobrze i bez (pozornie bez sensu) cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
Czy ktoś może mi powiedzieć, dlaczego potrzebuję cursor
?
Po prostu wydaje się bezcelowe. Dla każdej metody w moim skrypcie, która uzyskuje dostęp do bazy danych, mam utworzyć i zniszczyć cursor
?
Dlaczego po prostu nie użyć connection
obiektu?
c.execute('''SELECT * FROM users''')
zwraca iterator, który można wywołaćfetchall()
(lub inną metodę kursora). Niektóre zapytania SQL zwracają puste iteratory, ale nie należy się tego spodziewać.Potrzebujesz obiektu kursora, aby pobrać wyniki. Twój przykład działa, ponieważ jest to an
INSERT
i dlatego nie próbujesz odzyskać z niego żadnych wierszy, ale jeśli spojrzysz nasqlite3
dokumenty , zauważysz, że nie ma żadnych.fetchXXXX
metod na obiektach połączeń, więc jeśli spróbujesz to zrobić aSELECT
bez kursora nie miałbyś możliwości uzyskania danych wynikowych.Obiekty kursorów pozwalają na śledzenie, który zestaw wyników jest którym, ponieważ możliwe jest uruchomienie wielu zapytań, zanim zakończysz pobieranie wyników pierwszego.
źródło
execute
obiektu połączenia, jest tosqlite3
rozszerzenie.Zgodnie z oficjalną dokumentacją
connection.execute()
jest to niestandardowy skrót, który tworzy pośredni obiekt kursora:źródło
( dokumentacja sqlite3 ; wyróżnienie moje).
Ponieważ te metody obiektu połączenia są niestandardowe , tj. Nie są częścią specyfikacji API bazy danych Python v2.0 (PEP 249).
Dopóki używasz standardowych metod obiektu Cursor, możesz być pewien, że jeśli przełączysz się na inną implementację bazy danych, która jest zgodna z powyższą specyfikacją, Twój kod będzie w pełni przenośny. Być może będziesz musiał tylko zmienić
import
linię.Ale jeśli użyjesz,
connection.execute
istnieje szansa, że zmiana nie będzie taka prosta. To jest główny powód, dla którego możesz chcieć użyćcursor.execute
zamiast tego.Jeśli jednak jesteś pewien, że nie zamierzasz się przełączać, powiedziałbym, że całkowicie w porządku jest skorzystać ze
connection.execute
skrótu i być „wydajnym”.źródło
Daje nam możliwość posiadania wielu oddzielnych środowisk roboczych za pośrednictwem tego samego połączenia z bazą danych.
źródło