Python Data Persistence - Modulo Sqlite3
Uno dei principali svantaggi dei file CSV, JSON, XML, ecc. È che non sono molto utili per l'accesso casuale e l'elaborazione delle transazioni perché sono in gran parte di natura non strutturata. Quindi, diventa molto difficile modificare i contenuti.
Questi file flat non sono adatti per l'ambiente client-server in quanto mancano di capacità di elaborazione asincrona. L'utilizzo di file di dati non strutturati porta a ridondanza e incoerenza dei dati.
Questi problemi possono essere superati utilizzando un database relazionale. Un database è una raccolta organizzata di dati per rimuovere ridondanza e incoerenza e mantenere l'integrità dei dati. Il modello di database relazionale è molto popolare.
Il suo concetto di base è organizzare i dati in una tabella di entità (chiamata relazione). La struttura della tabella delle entità fornisce un attributo il cui valore è univoco per ogni riga. Tale attributo è chiamato'primary key'.
Quando la chiave primaria di una tabella appare nella struttura di altre tabelle, viene chiamata 'Foreign key'e questo costituisce la base del rapporto tra i due. Sulla base di questo modello, sono attualmente disponibili molti prodotti RDBMS popolari:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite è un database relazionale leggero utilizzato in un'ampia varietà di applicazioni. È un motore di database SQL autonomo, senza server, a configurazione zero e transazionale. L'intero database è un singolo file, che può essere posizionato ovunque nel file system. È un software open source, con un ingombro molto ridotto e nessuna configurazione. È comunemente utilizzato in dispositivi integrati, IOT e app mobili.
Tutti i database relazionali utilizzano SQL per la gestione dei dati nelle tabelle. Tuttavia, in precedenza, ciascuno di questi database era connesso con l'applicazione Python con l'aiuto del modulo Python specifico per il tipo di database.
Quindi, c'era una mancanza di compatibilità tra di loro. Se un utente volesse passare a un prodotto di database diverso, sarebbe difficile. Questo problema di incompatibilità è stato risolto sollevando la "Proposta di miglioramento di Python (PEP 248)" per consigliare un'interfaccia coerente per i database relazionali noti come DB-API. Vengono chiamate le ultime raccomandazioniDB-APIVersione 2.0. (PEP 249)
La libreria standard di Python è costituita dal modulo sqlite3 che è un modulo compatibile con DB-API per la gestione del database SQLite tramite il programma Python. Questo capitolo spiega la connettività di Python con il database SQLite.
Come accennato in precedenza, Python ha il supporto integrato per il database SQLite sotto forma di modulo sqlite3. Per altri database, il rispettivo modulo Python compatibile con DB-API dovrà essere installato con l'aiuto dell'utilità pip. Ad esempio, per utilizzare il database MySQL è necessario installare il modulo PyMySQL.
pip install pymysql
I seguenti passaggi sono consigliati in DB-API -
Stabilire la connessione con il database utilizzando connect() funzione e ottenere l'oggetto di connessione.
Chiamata cursor() metodo di connessione dell'oggetto per ottenere l'oggetto cursore.
Forma una stringa di query composta da un'istruzione SQL da eseguire.
Eseguire la query desiderata invocando execute() metodo.
Chiudi la connessione.
import sqlite3
db=sqlite3.connect('test.db')
Qui, db è l'oggetto di connessione che rappresenta test.db. Nota, quel database verrà creato se non esiste già. L'oggetto di connessione db ha i seguenti metodi:
Sr.No. | Metodi e descrizione |
---|---|
1 | cursor(): Restituisce un oggetto Cursor che utilizza questa connessione. |
2 | commit(): Salva esplicitamente le transazioni in sospeso nel database. |
3 | rollback(): Questo metodo facoltativo causa il rollback di una transazione al punto di partenza. |
4 | close(): Chiude definitivamente la connessione al database. |
Un cursore funge da handle per una determinata query SQL consentendo il recupero di una o più righe del risultato. L'oggetto Cursor viene ottenuto dalla connessione per eseguire query SQL utilizzando la seguente istruzione:
cur=db.cursor()
L'oggetto cursore ha i seguenti metodi definiti:
Suor n | Metodi e descrizione |
---|---|
1 | execute() Esegue la query SQL in un parametro stringa. |
2 | executemany() Esegue la query SQL utilizzando un set di parametri nell'elenco di tuple. |
3 | fetchone() Recupera la riga successiva dal set di risultati della query. |
4 | fetchall() Recupera tutte le righe rimanenti dal set di risultati della query. |
5 | callproc() Chiama una stored procedure. |
6 | close() Chiude l'oggetto cursore. |
Il codice seguente crea una tabella in 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()
L'integrità dei dati desiderata in un database è ottenuta tramite commit() e rollback()metodi dell'oggetto connessione. La stringa della query SQL potrebbe contenere una query SQL errata che può sollevare un'eccezione, che dovrebbe essere gestita correttamente. Per questo, l'istruzione execute () viene posizionata all'interno del blocco try Se ha successo, il risultato viene salvato in modo persistente utilizzando il metodo commit (). Se la query fallisce, la transazione viene annullata utilizzando il metodo rollback ().
Il codice seguente esegue la query INSERT sulla tabella studenti in 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()
Se si desidera che i dati nella clausola dei valori della query INSERT vengano forniti dinamicamente dall'input dell'utente, utilizzare la sostituzione dei parametri come consigliato in Python DB-API. Il ? Il carattere viene utilizzato come segnaposto nella stringa della query e fornisce i valori sotto forma di una tupla nel metodo execute (). L'esempio seguente inserisce un record utilizzando il metodo di sostituzione dei parametri. Nome, età e voti vengono presi come input.
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()
Il modulo sqlite3 definisce The executemany()metodo che è in grado di aggiungere più record contemporaneamente. I dati da aggiungere dovrebbero essere forniti in un elenco di tuple, con ogni tupla contenente un record. L'oggetto elenco è il parametro del metodo executemany (), insieme alla stringa della query. Tuttavia, il metodo executemany () non è supportato da alcuni degli altri moduli.
Il UPDATEquery di solito contiene un'espressione logica specificata dalla clausola WHERE La stringa di query nel metodo execute () deve contenere una sintassi di query UPDATE. Per aggiornare il valore di "age" a 23 per name = "Anil", definire la stringa come di seguito:
qry="update student set age=23 where name='Anil';"
Per rendere il processo di aggiornamento più dinamico, utilizziamo il metodo di sostituzione dei parametri come descritto sopra.
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()
Allo stesso modo, l'operazione DELETE viene eseguita chiamando il metodo execute () con una stringa con la sintassi della query DELETE di SQL. Per inciso,DELETE la query di solito contiene anche un file WHERE clausola.
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()
Una delle operazioni importanti su una tabella di database è il recupero dei record da essa. SQL fornisceSELECTquery per lo scopo. Quando una stringa contenente la sintassi della query SELECT viene fornita al metodo execute (), viene restituito un oggetto set di risultati. Esistono due metodi importanti con un oggetto cursore che utilizzano uno o più record dal set di risultati.
fetchone ()
Recupera il record successivo disponibile dal set di risultati. È una tupla composta dai valori di ciascuna colonna del record recuperato.
fetchall ()
Recupera tutti i record rimanenti sotto forma di un elenco di tuple. Ogni tupla corrisponde a un record e contiene i valori di ogni colonna nella tabella.
L'esempio seguente elenca tutti i record nella tabella degli studenti
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()
Se prevedi di utilizzare un database MySQL invece di un database SQLite, devi installare PyMySQLmodulo come descritto sopra. Tutti i passaggi nel processo di connettività del database sono gli stessi, poiché il database MySQL è installato su un server, la funzione connect () richiede l'URL e le credenziali di accesso.
import pymysql
con=pymysql.connect('localhost', 'root', '***')
L'unica cosa che può differire con SQLite sono i tipi di dati specifici di MySQL. Allo stesso modo, qualsiasi database compatibile con ODBC può essere utilizzato con Python installando il modulo pyodbc.