Tutto ciò che devi sapere su Python e mappe relazionali a oggetti
Potresti aver sentito parlare di mapping relazionale agli oggetti (ORM). Potresti averne persino usato uno, ma cosa sono esattamente? E come li usi in Python?
Ecco tutto ciò che devi sapere su ORM e Python.
Cos'è un ORM?
Object-relational mapping (ORM) è una tecnica di programmazione utilizzata per accedere a un database. Espone il tuo database in una serie di oggetti. Non è necessario scrivere comandi SQL per inserire o recuperare dati, si utilizzano una serie di attributi e metodi collegati agli oggetti.
Può sembrare complesso e non necessario, ma può farti risparmiare molto tempo e aiutarti a controllare l'accesso al tuo database.
Ecco un esempio. Dite che ogni volta che inserite una password nel vostro database volete farlo, come spiegato nella sicurezza della password del sito Web. Ogni sito Web sicuro fa questo con la vostra password Ogni sito sicuro fa questo con la vostra password Vi siete mai chiesti in che modo i siti Web proteggono la vostra password dai dati violazioni? Leggi di più . Questo non è un problema per i casi di utilizzo semplice: fai il calcolo prima di inserirlo. Ma cosa succede se è necessario inserire un record in molti punti del codice? Cosa succede se un altro programmatore inserisce nel tuo tavolo e non ne sai niente?
Utilizzando un ORM, è possibile scrivere codice per garantire che, quando e dove si accede a qualsiasi riga o campo nel database, l'altro codice personalizzato venga eseguito per primo.
Questo funge anche da “unica fonte di verità”. Se vuoi cambiare un calcolo personalizzato, devi solo cambiarlo in un posto, non in molti. È possibile eseguire molti di questi principi con la programmazione orientata agli oggetti (OOP) in Python Guida per principianti alla programmazione orientata agli oggetti di Python Guida per principianti alla programmazione orientata agli oggetti di Python Per sfruttare appieno i punti di forza di Python, vorrai imparare come Python funziona con la programmazione orientata agli oggetti (OOP). Ulteriori informazioni, ma gli ORM funzionano in tandem con i principi OOP per controllare l'accesso a un database.
Ci sono alcune cose a cui prestare attenzione quando si usa un ORM, e ci sono circostanze in cui non si può desiderare di usarne uno, ma sono generalmente considerate una buona cosa da avere, specialmente in una base di codice di grandi dimensioni.
ORM in Python utilizzando SQLAlchemy
Come molte attività in Python, è più facile e veloce importare un modulo che crearne uno tuo. Naturalmente, è possibile scrivere il proprio ORM, ma perché reinventare la ruota?
Gli esempi seguenti utilizzano tutti SQLAlchemy, un popolare ORM Python, ma molti dei principi si applicano indipendentemente dall'implementazione.
Impostazione di Python per SQLAlchemy
Prima di saltare a destra, dovrai configurare la tua macchina per lo sviluppo di Python con SQLAlchemy.
Avrai bisogno di usare Python 3.6 per seguire insieme questi esempi. Mentre le versioni precedenti funzioneranno, il codice seguente avrà bisogno di alcune modifiche prima di eseguirlo. Non sei sicuro delle differenze? Le nostre domande frequenti su Python Le domande più frequenti sulla programmazione Python Le domande più frequenti sulla programmazione Python In questo articolo ti illustreremo tutto ciò che devi sapere su Python come principiante. Leggi di più copre tutte le differenze.
Prima di iniziare la codifica, devi configurare un ambiente Python Scopri come utilizzare l'ambiente virtuale Python Scopri come utilizzare l'ambiente virtuale Python Se sei uno sviluppatore Python esperto, o sei appena iniziato, imparare come impostare un ambiente virtuale è essenziale per qualsiasi progetto Python. Leggi altro, che impedirà problemi con altri pacchetti Python importati.
Assicurati di avere PIP, il gestore di pacchetti Python Come installare PIP per Python su Windows, Mac e Linux Come installare PIP per Python su Windows, Mac e Linux Molti sviluppatori Python si affidano a uno strumento chiamato PIP per Python per rendere tutto molto più facile e veloce. Ecco come installare PIP. Leggi altro installato, che viene fornito con la maggior parte delle versioni moderne di Python.
Una volta che sei pronto, puoi iniziare a preparare SQLAlchemy. Dall'interno del tuo ambiente Python nella riga di comando, installa SQLAlchemy con pip installare comando:
pip installa SQLAlchemy-1.2.9
Il 1.2.9 è il numero di versione. Puoi lasciare questo fuori per ottenere l'ultimo pacchetto, ma è una buona pratica essere specifici. Non sai quando una nuova versione potrebbe infrangere il tuo codice attuale.
Ora sei pronto per iniziare la codifica. Potrebbe essere necessario preparare il database ad accettare una connessione Python, ma i seguenti esempi utilizzano tutti un database SQLite creato in memoria di seguito.
Modelli in SQLAlchemy
Uno dei componenti chiave di un ORM è a modello. Questa è una classe Python che descrive come dovrebbe essere una tabella e come dovrebbe funzionare. È la versione ORM del CREA TABELLA dichiarazione in SQL. Hai bisogno di un modello per ogni tabella nel tuo database.
Apri il tuo editor di testo o IDE preferito e crea un nuovo file chiamato test.py. Inserisci questo codice di avviamento, salva il file ed eseguilo:
da sqlalchemy import create_engine da sqlalchemy.ext.declarative import declarative_base Base = declarative_base () engine = create_engine ('sqlite: //') # Crea il database in memoria Base.metadata.create_all (engine) # Crea tutte le tabelle nel database
Questo codice fa molte cose. Le importazioni sono necessarie in modo che Python capisca dove trovare i moduli SQLAlchemy di cui ha bisogno. I tuoi modelli useranno il declarative_base in seguito, e configura qualsiasi nuovo modello per funzionare come previsto.
Il create_engine metodo crea una nuova connessione al tuo database. Se hai già un database, dovrai cambiare sqlite: // al tuo URI del database. Così com'è, questo codice creerà un nuovo database solo in memoria. Il database viene distrutto al termine dell'esecuzione del codice.
Finalmente, il create_all metodo crea tutte le tabelle definite nelle tue modalità nel tuo database. Poiché non hai ancora definito alcun modello, non accadrà nulla. Vai avanti ed esegui questo codice per assicurarti di non avere problemi o errori di battitura.
Facciamo un modello. Aggiungi un'altra importazione nella parte superiore del tuo file:
da sqlalchemy import Column, Integer, String
Questo importa il Colonna, Numero intero, e Stringa moduli da SQLAlchemy. Definiscono come funzionano le tabelle, i campi, le colonne e i tipi di dati del database.
Sotto il declarative_base, crea la tua classe modello:
class Cars (Base): __tablename__ = 'cars' id = Column (Integer, primary_key = True) make = Column (String (50), nullable = False) color = Column (String (50), nullable = False)
Questo semplice esempio utilizza auto, ma le tue tabelle potrebbero contenere dati.
Ogni classe deve ereditare Base. Il nome della tabella del database è definito in __tablename__. Questo dovrebbe essere uguale al nome della classe, ma questa è solo una raccomandazione e nulla si interromperà se non corrispondono.
Infine, ogni colonna è definita come una variabile python all'interno della classe. Vengono utilizzati diversi tipi di dati e il chiave primaria l'attributo dice a SQLAlchemy di creare il file id colonna come chiave primaria.
Vai avanti e aggiungi un'ultima importazione, questa volta per ForeignKey modulo. Aggiungi questo insieme al tuo Colonna importare:
da sqlalchemy import Column, ForeignKey, Integer, String
Ora crea una seconda classe di modelli. Questa classe è chiamata CarOwners, e memorizza i dettagli del proprietario di auto specifiche memorizzate nel Macchine tavolo:
class CarOwners (Base): __tablename__ = 'carowners' id = Column (Integer, primary_key = True) name = Column (String (50), nullable = False) age = Column (Integer, nullable = False) car_id = Column (Intero, ForeignKey ('cars.id')) car = relazione (Auto)
Ci sono diversi nuovi attributi introdotti qui. Il car_id il campo è definito come una chiave esterna. È collegato al id nel macchine tavolo. Si noti come viene utilizzato il nome della tabella in lettere minuscole, insted del nome della classe in lettere maiuscole.
Infine, un attributo di auto è definito come a relazione. Ciò consente al modello di accedere a Macchine tabella attraverso questa variabile. Questo è dimostrato di seguito.
Se esegui questo codice ora, vedrai che non succede nulla. Questo perché non gli hai detto di fare ancora qualcosa di evidente.
Oggetti in SQLAlchemy
Ora che i tuoi modelli sono stati creati, puoi iniziare ad accedere agli oggetti, leggere e scrivere dati. È una buona idea posizionare la logica nella propria classe e file, ma per ora può rimanere a fianco dei modelli.
Scrivere dati
In questo esempio, è necessario inserire alcuni dati nel database prima di poterlo leggere. Se stai utilizzando un database esistente, potresti già avere dati. In ogni caso, è ancora molto utile sapere come inserire i dati.
Potresti essere abituato a scrivere INSERIRE dichiarazioni in SQL. SQLAlchemy gestisce questo per te. Ecco come inserire una riga nel file Macchine modello. Inizia con una nuova importazione per sessionmaker:
da sqlalchemy.orm import sessionmaker
Questo è necessario per creare il sessione e DBSession oggetti, che sono usati per leggere e scrivere dati:
DBSession = sessionmaker (bind = engine) session = DBSession ()
Ora metti questo sotto il tuo create_all dichiarazione:
car1 = Cars (make = "Ford", color = "silver") session.add (car1) session.commit ()
Analizziamo quel codice. La variabile car1 è definito come un oggetto basato sul Macchine modello. La sua marca e colore sono impostati come parametri. È come dire “fammi una macchina, ma non scriverlo ancora nel database”. Questa macchina esiste in memoria ma sta aspettando di essere scritta.
Aggiungi l'auto alla sessione con session.add, e poi scriverlo nel database con session.commit.
Ora aggiungiamo un proprietario:
owner1 = CarOwners (name = "Joe", age = "99", car_id = (car1.id)) session.add (owner1) session.commit ()
Questo codice è quasi identico al precedente inserto per Macchine modello. La differenza principale qui è quella car_id è una chiave esterna, quindi ha bisogno di un id di riga che esiste nell'altra tabella. Questo è accessibile tramite il car1.id proprietà.
Non è necessario interrogare il database o restituire alcun ID, dato che SQLAlchemy gestisce ciò per te (a condizione che i dati vengano prima salvati).
Dati di lettura
Una volta scritti alcuni dati, puoi iniziare a leggerli. Ecco come interrogare il Macchine e CarOwners tabelle:
result = session.query (Cars) .all ()
È così semplice Usando il domanda metodo trovato nel sessione, si specifica il modello e quindi si utilizza il tutti metodo per recuperare tutti i risultati. Se sai che ci sarà solo un risultato, allora puoi usare il primo metodo:
result = session.query (Cars) .first ()
Una volta interrogato il modello e memorizzati i risultati restituiti in una variabile, è possibile accedere ai dati tramite l'oggetto:
stampa (risultato [0] .color)
Questo stampa il colore “argento”, come quel record è la prima fila. È possibile eseguire il loop sull'oggetto risultato se lo si desidera.
Come hai definito la relazione nel tuo modello, è possibile accedere ai dati nelle tabelle correlate senza specificare un join:
result = session.query (CarOwners) .all () print (result [0] .name) print (result [0] .car.color)
Questo funziona perché il tuo modello contiene dettagli sulla struttura della tua tabella e il auto attributo è stato definito come un collegamento al macchine tavolo.
Cosa non piace sugli ORM?
Questo tutorial copriva solo le basi, ma una volta capito, puoi spostarti sugli argomenti avanzati. Ci sono alcuni potenziali svantaggi per gli ORM:
- Devi scrivere il tuo modello prima di poter eseguire qualsiasi query.
- È un'altra nuova sintassi da imparare.
- Potrebbe essere troppo complesso per esigenze semplici.
- È necessario avere un buon design del database per cominciare.
Questi problemi non sono un grosso problema da soli, ma sono cose a cui prestare attenzione. Se stai lavorando con un database esistente, potresti essere scoperto.
Se non sei convinto che un ORM sia lo strumento giusto per te, assicurati di leggere i comandi SQL importanti che i programmatori dovrebbero conoscere 13 Comandi SQL più importanti Qualunque programmatore dovrebbe sapere 13 Comandi SQL più importanti Qualsiasi programmatore dovrebbe sapere Ogni grande o dinamico il sito Web utilizza un database in qualche modo e, quando combinato con Structured Query Language (SQL), le possibilità di manipolare i dati sono davvero infinite. Leggi di più .
Scopri di più su: Esercitazioni di codifica, Python, SQL.