Trwałość danych w języku Python - moduł Sqlite3

Jedną z głównych wad plików CSV, JSON, XML itp. Jest to, że nie są one zbyt przydatne do losowego dostępu i przetwarzania transakcji, ponieważ mają w dużej mierze charakter nieustrukturyzowany. W związku z tym bardzo trudno jest modyfikować zawartość.

Te pliki płaskie nie są odpowiednie dla środowiska klient-serwer, ponieważ nie mają możliwości przetwarzania asynchronicznego. Korzystanie z nieustrukturyzowanych plików danych prowadzi do nadmiarowości i niespójności danych.

Te problemy można rozwiązać za pomocą relacyjnej bazy danych. Baza danych to zorganizowany zbiór danych służący do usuwania nadmiarowości i niespójności oraz utrzymywania integralności danych. Model relacyjnej bazy danych jest bardzo popularny.

Jego podstawową koncepcją jest uporządkowanie danych w tabeli encji (zwanej relacją). Struktura tabeli encji zawiera jeden atrybut, którego wartość jest unikalna dla każdego wiersza. Taki atrybut nazywa się'primary key'.

Gdy klucz podstawowy jednej tabeli pojawia się w strukturze innych tabel, jest wywoływany 'Foreign key'a to stanowi podstawę relacji między nimi. W oparciu o ten model obecnie dostępnych jest wiele popularnych produktów RDBMS -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite to lekka relacyjna baza danych używana w wielu różnych zastosowaniach. Jest to samodzielny, bezserwerowy silnik transakcyjnej bazy danych SQL o zerowej konfiguracji. Cała baza danych to pojedynczy plik, który można umieścić w dowolnym miejscu w systemie plików. Jest to oprogramowanie typu open source, o bardzo małej powierzchni i zerowej konfiguracji. Jest powszechnie używany w urządzeniach wbudowanych, IOT i aplikacjach mobilnych.

Wszystkie relacyjne bazy danych używają języka SQL do obsługi danych w tabelach. Jednak wcześniej każda z tych baz danych była połączona z aplikacją Python za pomocą modułu Pythona specyficznego dla typu bazy danych.

Stąd brakowało między nimi kompatybilności. Gdyby użytkownik chciał przejść na inny produkt bazodanowy, byłoby to trudne. Ten problem niekompatybilności został rozwiązany poprzez podniesienie „Propozycji ulepszeń języka Python (PEP 248)” w celu zalecenia spójnego interfejsu dla relacyjnych baz danych znanych jako DB-API. Najnowsze rekomendacje są nazywaneDB-APIWersja 2.0.0 (PEP 249)

Biblioteka standardowa Pythona składa się z modułu sqlite3, który jest modułem zgodnym z DB-API do obsługi bazy danych SQLite za pomocą programu w Pythonie. W tym rozdziale wyjaśniono łączność Pythona z bazą danych SQLite.

Jak wspomniano wcześniej, Python ma wbudowaną obsługę bazy danych SQLite w postaci modułu sqlite3. W przypadku innych baz danych odpowiedni moduł Pythona zgodny z DB-API będzie musiał zostać zainstalowany za pomocą narzędzia pip. Na przykład, aby skorzystać z bazy danych MySQL, musimy zainstalować moduł PyMySQL.

pip install pymysql

Poniższe kroki są zalecane w DB-API -

  • Nawiąż połączenie z bazą danych za pomocą connect() funkcji i uzyskać obiekt połączenia.

  • Połączenie cursor() metoda połączenia obiektu, aby uzyskać obiekt kursora.

  • Utwórz ciąg zapytania składający się z instrukcji SQL do wykonania.

  • Wykonaj żądane zapytanie, wywołując execute() metoda.

  • Zamknij połączenie.

import sqlite3
db=sqlite3.connect('test.db')

Tutaj db jest obiektem połączenia reprezentującym test.db. Zauważ, że ta baza danych zostanie utworzona, jeśli jeszcze nie istnieje. Baza danych obiektu połączenia ma następujące metody -

Sr.No. Metody i opis
1

cursor():

Zwraca obiekt Cursor, który używa tego połączenia.

2

commit():

Jawnie zatwierdza wszystkie oczekujące transakcje do bazy danych.

3

rollback():

Ta opcjonalna metoda powoduje wycofanie transakcji do punktu początkowego.

4

close():

Trwale zamyka połączenie z bazą danych.

Kursor działa jak uchwyt dla danego zapytania SQL, umożliwiając pobranie jednego lub więcej wierszy wyniku. Obiekt Cursor jest uzyskiwany z połączenia w celu wykonywania zapytań SQL za pomocą następującej instrukcji -

cur=db.cursor()

Obiekt kursora ma zdefiniowane następujące metody -

Sr.No Metody i opis
1

execute()

Wykonuje zapytanie SQL w parametrze ciągu.

2

executemany()

Wykonuje zapytanie SQL przy użyciu zestawu parametrów z listy krotek.

3

fetchone()

Pobiera następny wiersz z zestawu wyników zapytania.

4

fetchall()

Pobiera wszystkie pozostałe wiersze z zestawu wyników zapytania.

5

callproc()

Wywołuje procedurę składowaną.

6

close()

Zamyka obiekt kursora.

Poniższy kod tworzy tabelę w test.db: -

import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()

Pożądaną integralność danych w bazie danych zapewnia commit() i rollback()metody obiektu połączenia. Ciąg zapytania SQL może zawierać niepoprawne zapytanie SQL, które może zgłosić wyjątek, który powinien zostać poprawnie obsłużony. W tym celu instrukcja execute () jest umieszczana w bloku try. Jeśli się powiedzie, wynik jest trwale zapisywany przy użyciu metody commit (). Jeśli zapytanie nie powiedzie się, transakcja jest cofana przy użyciu metody rollback ().

Poniższy kod wykonuje zapytanie INSERT na tabeli uczniów w test.db.

import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
   cur=db.cursor()
   cur.execute(qry)
   db.commit()
print ("record added successfully")
except:
   print ("error in query")
   db.rollback()
db.close()

Jeśli chcesz, aby dane w klauzuli wartości zapytania INSERT były dynamicznie dostarczane przez dane wejściowe użytkownika, użyj podstawiania parametrów zgodnie z zaleceniami w Python DB-API. The? Znak jest używany jako symbol zastępczy w ciągu zapytania i dostarcza wartości w postaci krotki w metodzie execute (). Poniższy przykład wstawia rekord przy użyciu metody podstawiania parametrów. Imię, wiek i stopnie są traktowane jako dane wejściowe.

import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,a,m))
   db.commit()
   print ("one record added successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Moduł sqlite3 definiuje plik executemany()metoda, która jest w stanie dodać wiele rekordów jednocześnie. Dane do dodania należy podać w postaci listy krotek, przy czym każda krotka zawiera jeden rekord. Obiekt listy jest parametrem metody executemany () wraz z ciągiem zapytania. Jednak metoda executemany () nie jest obsługiwana przez niektóre inne moduły.

Plik UPDATEzapytanie zwykle zawiera wyrażenie logiczne określone klauzulą ​​WHERE Łańcuch zapytania w metodzie execute () powinien zawierać składnię zapytania UPDATE. Aby zaktualizować wartość „age” do 23 dla name = „Anil”, zdefiniuj ciąg w następujący sposób:

qry="update student set age=23 where name='Anil';"

Aby proces aktualizacji był bardziej dynamiczny, używamy metody zastępowania parametrów opisanej powyżej.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (a, nm))
   db.commit()
   print("record updated successfully")
except:
   print("error in query")
   db.rollback()
db.close()

Podobnie operacja DELETE jest wykonywana przez wywołanie metody execute () z łańcuchem znaków o składni zapytania SQL DELETE. Nawiasem mówiąc,DELETE zapytanie zwykle zawiera również plik WHERE klauzula.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,))
   db.commit()
   print("record deleted successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Jedną z ważnych operacji na tabeli bazy danych jest pobieranie z niej rekordów. SQL zapewniaSELECTzapytanie o cel. Gdy do metody execute () podany jest łańcuch zawierający składnię zapytania SELECT, zwracany jest obiekt tabeli wyników. Istnieją dwie ważne metody z obiektem kursora, za pomocą których można pobrać jeden lub wiele rekordów ze zbioru wyników.

fetchone ()

Pobiera następny dostępny rekord z zestawu wyników. Jest to krotka składająca się z wartości każdej kolumny pobranego rekordu.

fetchall ()

Pobiera wszystkie pozostałe rekordy w postaci listy krotek. Każda krotka odpowiada jednemu rekordowi i zawiera wartości każdej kolumny w tabeli.

Poniższy przykład zawiera listę wszystkich rekordów w tabeli uczniów

import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
   record=cur.fetchone()
   if record==None:
      break
   print (record)
db.close()

Jeśli planujesz używać bazy danych MySQL zamiast bazy danych SQLite, musisz zainstalować PyMySQLmoduł opisany powyżej. Wszystkie kroki w procesie łączenia się z bazą danych są takie same, ponieważ baza danych MySQL jest zainstalowana na serwerze, funkcja connect () wymaga adresu URL i danych logowania.

import pymysql
con=pymysql.connect('localhost', 'root', '***')

Jedyną rzeczą, która może różnić się od SQLite, są typy danych specyficzne dla MySQL. Podobnie, każda baza danych zgodna z ODBC może być używana z Pythonem po zainstalowaniu modułu pyodbc.