ORM : SQLAlchemy¶
Pots consultar més informació sobre SQLAlchemy en la seva documentació oficial.
Instal·lació de SQLAlchemy¶
Per instal·lar SQLAlchemy podem utilitzar el pip. A més, necessitem el driver de PostgreSQL:
Exemple: Creació de taules¶
El primer que es fa amb un ORM es definir el model de dades. Cada classe del nostre ORM es transformarà en una taula, i cada atribut en un camp.
Creem dintre de postgresql una base de dades que l'anomenarem db_agenda
CREATE DATABASE db_agenda;
CREATE USER uagenda WITH PASSWORD '12345';
GRANT ALL PRIVILEGES ON DATABASE db_agenda TO uagenda;
Ara escriurem el codi utilitzant el ORM per tal de que ens crei les taules.
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey
from sqlalchemy.orm import DeclarativeBase
engine = create_engine('postgresql+psycopg2://uagenda:12345@localhost:5432/db_agenda')
class Base(DeclarativeBase):
pass
class Persona(Base):
__tablename__ = 'persona'
id_p = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String)
cognoms = Column(String)
data_naixement = Column(Date)
class Telefon(Base):
__tablename__ = 'telefon'
id_t = Column(Integer, primary_key=True, autoincrement=True)
persona_id = Column(Integer, ForeignKey('persona.id_p'))
numero = Column(String(20))
Base.metadata.create_all(engine)
Si anem a mirar la base de dades després d'executar el programa veurem que ens ha creat les taules.
Es poden consultar quins tipus de dades podem tenir en el model, en la documentació de tipus de SQLAlchemy.
Exemple: Inserció de registres¶
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Session
engine = create_engine('postgresql+psycopg2://uagenda:12345@localhost:5432/db_agenda')
class Base(DeclarativeBase):
pass
class Persona(Base):
__tablename__ = 'persona'
id_p = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String)
cognoms = Column(String)
data_naixement = Column(Date)
class Telefon(Base):
__tablename__ = 'telefon'
id_t = Column(Integer, primary_key=True, autoincrement=True)
persona_id = Column(Integer, ForeignKey('persona.id_p'))
numero = Column(String(20))
with Session(engine) as sessio:
agarcia = Persona(nom='antoni', cognoms='garcia sanchez', data_naixement='1978-09-21')
sessio.add(agarcia)
sessio.flush() # per obtenir l'id_p generat
tel_agarcia = Telefon(persona_id=agarcia.id_p, numero='972335794')
sessio.add(tel_agarcia)
sessio.commit()
Exemple: Modificació de registres¶
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey, update
from sqlalchemy.orm import DeclarativeBase, Session
engine = create_engine('postgresql+psycopg2://uagenda:12345@localhost:5432/db_agenda')
class Base(DeclarativeBase):
pass
class Persona(Base):
__tablename__ = 'persona'
id_p = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String)
cognoms = Column(String)
data_naixement = Column(Date)
class Telefon(Base):
__tablename__ = 'telefon'
id_t = Column(Integer, primary_key=True, autoincrement=True)
persona_id = Column(Integer, ForeignKey('persona.id_p'))
numero = Column(String(20))
with Session(engine) as sessio:
sessio.execute(
update(Telefon).where(Telefon.id_t == 1).values(numero='972356758')
)
sessio.commit()
Exemple: Eliminar registres¶
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey, delete
from sqlalchemy.orm import DeclarativeBase, Session
engine = create_engine('postgresql+psycopg2://uagenda:12345@localhost:5432/db_agenda')
class Base(DeclarativeBase):
pass
class Persona(Base):
__tablename__ = 'persona'
id_p = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String)
cognoms = Column(String)
data_naixement = Column(Date)
class Telefon(Base):
__tablename__ = 'telefon'
id_t = Column(Integer, primary_key=True, autoincrement=True)
persona_id = Column(Integer, ForeignKey('persona.id_p'))
numero = Column(String(20))
with Session(engine) as sessio:
sessio.execute(
delete(Telefon).where(Telefon.numero == '972356758')
)
sessio.commit()
Exemple: Consulta de registres¶
from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey, select
from sqlalchemy.orm import DeclarativeBase, Session
engine = create_engine('postgresql+psycopg2://uagenda:12345@localhost:5432/db_agenda')
class Base(DeclarativeBase):
pass
class Persona(Base):
__tablename__ = 'persona'
id_p = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String)
cognoms = Column(String)
data_naixement = Column(Date)
class Telefon(Base):
__tablename__ = 'telefon'
id_t = Column(Integer, primary_key=True, autoincrement=True)
persona_id = Column(Integer, ForeignKey('persona.id_p'))
numero = Column(String(20))
with Session(engine) as sessio:
consulta = sessio.execute(select(Persona)).scalars().all()
for p in consulta:
print(f"{p.cognoms}, {p.nom}")