#!/usr/bin/env python # coding: utf-8 # # Podjetje, varianta 1 # In[1]: from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, func, select, create_engine from sqlalchemy.orm import declarative_base, relationship, backref, sessionmaker from datetime import datetime # In[2]: Base = declarative_base() class Oddelek(Base): __tablename__ = 'oddelek' id = Column(Integer, primary_key=True) naziv = Column(String) def __repr__(self): return f"Oddelek[{self.id}, {self.naziv}, {self.seznamZaposlenih}]" class Zaposleni(Base): __tablename__ = 'zaposleni' id = Column(Integer, primary_key=True) ime = Column(String) # uporabimo razred func za dostop do funkcij na bazi, npr. func.now() datum_zaposlitve = Column(DateTime, default=func.now()) oddelek_id = Column(Integer, ForeignKey('oddelek.id')) # cascade='delete,all' bo povzročil brisanje vseh zaposlenih v oddelku oddelek = relationship(Oddelek, backref=backref('seznamZaposlenih', uselist=True, cascade='delete,all')) def __repr__(self): return f"Zaposleni[{self.id}, {self.ime}, {self.datum_zaposlitve}, {self.oddelek_id}]" # In[3]: engine = create_engine('sqlite:///podjetje1.db', echo=True) Base.metadata.bind = engine Base.metadata.create_all(engine) # In[4]: DBSessionMaker = sessionmaker(bind=engine) session = DBSessionMaker() # Ustvarimo oddelek. # In[5]: (oddelek1 := Oddelek(naziv="IT")) # Ustvarimo zaposlenega. # In[6]: (zaposleni1 := Zaposleni(ime="Janez", oddelek=oddelek1)) # Dodajmo ustvarjena objekta v bazo. # In[7]: session.add(oddelek1) session.add(zaposleni1) session.commit() # Izpišimo trenutno vsebino baze. # In[8]: session.query(Zaposleni).all() # In[9]: session.query(Oddelek).all() # Izbrišimo `oddelek1`. # In[10]: session.delete(oddelek1) session.commit() # Spet izpišimo trenutno vsebino baze. # In[11]: session.query(Zaposleni).all() # In[12]: session.query(Oddelek).all() # Ustvarimo naslednjega zaposlenega in izpišimo datum zaposlitve. # In[13]: zaposleni2 = Zaposleni(ime="Francka") session.add(zaposleni2) print(zaposleni2.datum_zaposlitve) # Privzeta vrednost se nastavi šele, ko kličemo `commit`. # In[14]: session.commit() print(zaposleni2.datum_zaposlitve) # Za privzeto vrednost smo uporabili `func.now()`. Izpišimo njeno vrednost pred in po interakciji z bazo. # In[15]: func.now() # In[16]: rs = session.execute(select(func.now())) rs.fetchone() # Pobrišimo vse oddelke in uporabnike v njih. # In[17]: for oddelek in session.query(Oddelek).all(): session.delete(oddelek) session.commit() # Še enkrat preglejmo zaposlene. # In[18]: session.query(Zaposleni).all() # Ustvarimo dva oddelka in tri zaposlene, ki jih vstavimo v oddelke. # In[19]: IT = Oddelek(naziv="IT") finance = Oddelek(naziv="Finance") janez = Zaposleni(ime="Janez", oddelek=IT) metka = Zaposleni(ime="Metka", oddelek=finance) session.add(IT) session.add(finance) session.add(janez) session.add(metka) session.commit() # In[21]: katka = Zaposleni(ime="Katka", oddelek=finance) session.add(katka) session.commit() # Preštejmo zaposlene. # In[22]: session.query(Zaposleni).count() # Izpišimo ime enega zaposlenega, ki se začne na črko K. # In[23]: session.query(Zaposleni).filter(Zaposleni.ime.startswith("K")).one().ime # Izpišimo ime enega zaposlenega, ki je hkrati v oddelku Finance in se njegovo ime začne na črko K. # In[26]: session.query(Zaposleni).join(Zaposleni.oddelek).filter(Zaposleni.ime.startswith('K'), Oddelek.naziv == 'Finance').all() # Izpišimo število zaposlenih, ki so bili zaposleni v preteklosti. # In[27]: session.query(Zaposleni).filter(Zaposleni.datum_zaposlitve < func.now()).count()