Tot el que heu de saber sobre Python i els mapes relacionals entre objectes

Tot el que heu de saber sobre Python i els mapes relacionals entre objectes

És possible que hagueu sentit a parlar del mapatge relacional d'objectes (ORM). Fins i tot n’heu utilitzat un, però, què són exactament? I com els feu servir a Python?





Aquí teniu tot el que heu de saber sobre els ORM i Python.





Què és un ORM?

El mapatge relacional d'objectes (ORM) és una tècnica de programació que s'utilitza per accedir a una base de dades. Exposa la vostra base de dades a una sèrie d’objectes. No cal que escriviu ordres SQL per inserir o recuperar dades, heu d’utilitzar una sèrie d’atributs i mètodes adjunts a objectes.





Pot semblar complex i innecessari, però us pot estalviar molt de temps i ajudar a controlar l'accés a la vostra base de dades.

Aquí en teniu un exemple. Digueu que sempre que inseriu una contrasenya a la base de dades, voleu fer-ne una hash, tal com s’explica a la seguretat de la contrasenya del lloc web. Això no és un problema per als casos d'ús simples: heu de fer el càlcul abans d'inserir-lo. Però, i si cal inserir un registre en molts llocs del codi? Què passa si un altre programador insereix a la vostra taula i no en sabeu res?



En utilitzar un ORM, podeu escriure codi per assegurar-vos que, sempre i quan s’accedeixi a qualsevol fila o camp de la base de dades, s’executi primer el vostre altre codi personalitzat.

Això també actua com una 'font única de veritat'. Si voleu canviar un càlcul personalitzat, només heu de canviar-lo en un lloc i no en diversos. És possible realitzar molts d'aquests principis amb programació orientada a objectes (OOP) a Python , però els ORM funcionen de forma conjunta amb els principis de POO per controlar l'accés a una base de dades.





Hi ha certes coses que cal tenir en compte quan s’utilitza un ORM, i hi ha circumstàncies en què potser no en voleu utilitzar cap, però generalment es considera que és bo tenir, sobretot en una base de codis gran.

ORM a Python mitjançant SQLAlchemy

Com moltes tasques a Python, és més ràpid i senzill importar un mòdul que escriure el vostre. Per descomptat, és possible escriure el vostre propi ORM, però per què reinventar la roda?





Tots els exemples següents s'utilitzen SQLAlchemy , un ORM popular de Python, però molts dels principis s'apliquen independentment de la implementació.

Configuració de Python per a SQLAlchemy

Abans de saltar directament, haureu de configurar la màquina per al desenvolupament de Python amb SQLAlchemy.

Haureu d’utilitzar Python 3.6 per seguir aquests exemples. Tot i que les versions anteriors funcionaran, el codi següent necessitarà algunes modificacions abans que s'executi. No esteu segur de les diferències? Les nostres preguntes freqüents sobre Python cobreixen totes les diferències.

Abans de codificar, heu de configurar un entorn Python, que evitarà problemes amb altres paquets Python importats.

Assegureu-vos que en teniu PIP, el gestor de paquets Python instal·lat, que inclou les versions més modernes de Python.

Quan estigueu a punt per començar, podeu començar preparant SQLAlchemy. Des del vostre entorn Python a la línia d'ordres, instal·leu SQLAlchemy amb el fitxer instal·lar pip comandament:

pip install SQLAlchemy-1.2.9

El 1.2.9 és el número de versió. Podeu deixar això per obtenir el darrer paquet, però és una bona pràctica ser específic. No sabeu quan una nova versió pot trencar el vostre codi actual.

Ara ja podeu començar a codificar. És possible que hàgiu de preparar la vostra base de dades per acceptar una connexió Python, però tots els exemples següents utilitzen un fitxer SQLite base de dades creada a la memòria a continuació.

Models a SQLAlchemy

Un dels components clau d'un ORM és un model . Es tracta d’una classe Python que descriu com ha de ser una taula i com ha de funcionar. És la versió ORM del CREA TAULA declaració a SQL. Necessiteu un model per a cada taula de la vostra base de dades.

Obriu el vostre editor de text o IDE favorit i creeu un fitxer nou anomenat test.py . Introduïu aquest codi d’inici, deseu el fitxer i executeu-lo:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Aquest codi fa diverses coses. Les importacions són necessàries perquè Python entengui on trobar els mòduls SQLAlchemy que necessita. Els vostres models utilitzaran el fitxer base_declarativa més endavant, i configura qualsevol model nou perquè funcioni com s’esperava.

El create_engine crea una nova connexió a la vostra base de dades. Si ja teniu una base de dades, haureu de canviar-la sqlite: // a la URI de la vostra base de dades. Tal com és, aquest codi crearà una nova base de dades només a la memòria. La base de dades es destrueix un cop finalitza l'execució del codi.

Finalment, el fitxer create_all mètode crea totes les taules definides en els vostres modes a la vostra base de dades. Com que encara no heu definit cap model, no passarà res. Seguiu endavant i executeu aquest codi per assegurar-vos que no tingueu problemes ni errors tipogràfics.

Fem un model. Afegiu una altra importació a la part superior del fitxer:

from sqlalchemy import Column, Integer, String

Això importa el fitxer Columna , Enter , i Corda mòduls de SQLAlchemy. Defineixen el funcionament de les taules, camps, columnes i tipus de dades de la base de dades.

Sota el fitxer base_declarativa , creeu la vostra classe de models:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

Aquest exemple senzill utilitza cotxes, però les vostres taules poden contenir dades.

Cada classe ha d’heretar base . El nom de la taula de la vostra base de dades es defineix a __nom de taula__ . Hauria de ser el mateix que el nom de la classe, però això és només una recomanació i res no trencarà si no coincideixen.

Finalment, cada columna es defineix com una variable python dins de la classe. S'utilitzen diferents tipus de dades i el fitxer clau primària L'atribut li diu a SQLAlchemy que creï el fitxer identificador columna com a clau principal.

Seguiu endavant i afegiu una última importació, aquesta vegada per al fitxer Clau estrangera mòdul. Afegiu-ho al costat del vostre Columna importació:

from sqlalchemy import Column, ForeignKey, Integer, String

Ara creeu una segona classe de models. Aquesta classe es diu Propietaris de vehicles , i detalla el propietari de les botigues de vehicles específics emmagatzemats a Cotxes taula:

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(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

Hi ha diversos atributs nous introduïts aquí. El car_id camp es defineix com una clau externa. Està vinculat al identificador al cotxes taula. Fixeu-vos en com s'utilitza el nom de la taula en minúscules, en el cas del nom de la classe en majúscules.

Finalment, un atribut de cotxe es defineix com a relació . Això permet al vostre model accedir al fitxer Cotxes taula a través d’aquesta variable. Això es demostra a continuació.

Si executeu aquest codi ara, veureu que no passa res. Això es deu al fet que encara no li heu dit que faci res perceptible.

Objectes en SQLAlchemy

Ara que es creen els vostres models, podeu començar a accedir als objectes i llegir i escriure dades. És una bona idea situar la vostra lògica en la seva pròpia classe i fitxer, però, de moment, es pot mantenir al costat dels models.

Redacció de dades

En aquest exemple, cal inserir algunes dades a la base de dades abans de poder llegir-les. Si feu servir una base de dades existent, és possible que ja tingueu dades. Sigui com sigui, encara és molt útil saber com inserir dades.

Pot estar acostumat a escriure INSERTAR declaracions a SQL. SQLAlchemy s’encarrega d’això. A continuació s'explica com inserir una fila al fitxer Cotxes model. Comenceu amb una importació nova per a creador de sessions :

from sqlalchemy.orm import sessionmaker

Això és necessari per crear el fitxer sessió i DBSession objectes, que s’utilitzen per llegir i escriure dades:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Ara poseu això a sota del vostre create_all declaració:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Desglossem aquest codi. La variable cotxe1 es defineix com un objecte basat en el fitxer Cotxes model. La seva marca i color es defineixen com a paràmetres. Això és com dir 'fes-me un cotxe, però encara no l'escrivis a la base de dades'. Aquest cotxe existeix a la memòria, però està pendent de ser escrit.

Afegiu el cotxe a la sessió amb sessió.afegeix i, a continuació, escriviu-lo a la base de dades amb session.commit .

Ara afegim un propietari:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Aquest codi és gairebé idèntic a la inserció anterior per al fitxer Cotxes model. La principal diferència aquí és que car_id és una clau estrangera, de manera que necessita un identificador de fila que existeixi a l'altra taula. S'hi accedeix a través de car1.id propietat.

No haureu de consultar la base de dades ni retornar cap identificador, ja que SQLAlchemy ho gestiona (sempre que comenceu les dades primer).

Lectura de dades

Un cop hàgiu escrit algunes dades, podreu començar a llegir-les de nou. A continuació s'explica com consultar el fitxer Cotxes i Propietaris de vehicles taules:

result = session.query(Cars).all()

És tan senzill. En utilitzar el fitxer consulta mètode que es troba al fitxer sessió , especifiqueu el model i, a continuació, utilitzeu el fitxer tot mètode per recuperar tots els resultats. Si sabeu que només hi haurà un resultat, podeu utilitzar el fitxer primer mètode:

result = session.query(Cars).first()

Un cop consultat el model i emmagatzemat els resultats retornats en una variable, podeu accedir a les dades mitjançant l'objecte:

print(result[0].color)

Això imprimeix el color 'plata', ja que aquest registre és la primera fila. Podeu fer un bucle sobre l'objecte resultat si voleu.

Tal com heu definit la relació al vostre model, és possible accedir a les dades de les taules relacionades sense especificar una unió:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

Això funciona perquè el vostre model conté detalls de l'estructura de la taula i el fitxer cotxe es va definir com un enllaç al fitxer cotxes taula.

Què no m'agrada dels ORM?

Aquest tutorial només va cobrir els aspectes bàsics, però un cop els hàgiu comprès, podeu seguir els temes avançats. Hi ha alguns desavantatges potencials de les ORM:

  • Heu d’escriure el vostre model abans de poder executar qualsevol consulta.
  • És una altra sintaxi nova per aprendre.
  • Pot ser massa complex per a necessitats senzilles.
  • Per començar, heu de tenir un bon disseny de base de dades.

Aquests problemes no són un gran problema per si sols, però són coses a tenir en compte. Si esteu treballant amb una base de dades existent, és possible que us atrapi.

Si no esteu convençut que un ORM és l'eina adequada per a vosaltres, assegureu-vos de llegir sobre importants ordres SQL que els programadors haurien de saber .

Compartir Compartir Tweet Correu electrònic Heu d'actualitzar el Windows 11 immediatament?

Windows 11 arribarà aviat, però hauríeu d’actualitzar el més aviat possible o esperar unes setmanes? Anem a esbrinar.

Llegiu a continuació
Temes relacionats
  • Programació
  • Python
  • SQL
  • Tutorials de codificació
Sobre l'autor Joe Coburn(136 articles publicats)

Joe és llicenciat en Informàtica per la Universitat de Lincoln, Regne Unit. És un desenvolupador de programari professional i, quan no fa drons voladors ni escriu música, sovint se’l pot trobar fent fotos o produint vídeos.

instal·lant una nova versió d’Office 2016
Més de Joe Coburn

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us