""" **Consignes :** 1. Définissez deux modèles `Equipement` et `Interface` avec une relation **1-N** (`relationship` + `ForeignKey` + `back_populates`). 2. Créez le moteur SQLite et générez les tables (`create_all`). 3. Dans une `Session`, créez **un équipement avec ses deux interfaces en une seule fois**, puis `commit`. 4. Récupérez les équipements avec `select()` et affichez, pour chacun, la liste de ses interfaces. """ from sqlalchemy import create_engine, select from sqlalchemy.orm import DeclarativeMeta, declarative_base, sessionmaker Base: DeclarativeMeta = declarative_base() db_url = "sqlite:///exo_2_1.db" def get_engine(): return create_engine(url= db_url) def get_session(): engine = get_engine() Session = sessionmaker(bind= engine) return Session() engine = get_engine() from random import choice, randint from sqlalchemy import ForeignKey, Column, Integer, Float, String, Boolean from sqlalchemy.orm import relationship class Equipment(Base): __tablename__ = "equipments" id = Column(Integer, primary_key= True, autoincrement= True) hostname = Column(String, default= "[HOSTNAME]", nullable= False) type = Column(String, default= "Server", nullable= False) ip_address = Column(String, default= "255.255.255.0", nullable= False) is_active = Column(Boolean, default= True, nullable= False) latency = Column(Float, nullable= False) interfaces = relationship("Interface", back_populates="equipment") class Interface(Base): __tablename__ = "interfaces" id = Column(Integer, primary_key= True, autoincrement= True) port = Column(Integer, nullable= False) service = Column(String, default= "[SERVICE]", nullable= False) equipment_id = Column(Integer, ForeignKey("equipments.id"), nullable= False) equipment = relationship("Equipment", back_populates="interfaces") Base.metadata.create_all(engine) session = get_session() def random_ipv4() -> str: return ".".join(str(randint(0, 255)) for _ in range(4)) def load_words(path: str = "wordlist.txt") -> list[str]: with open(path, "r", encoding="utf-8") as f: return [line.strip() for line in f if line.strip()] def random_hostname(words: list[str] | None = None) -> str: if words is None: words = load_words() triplet = "-".join(choice(words) for _ in range(3)) number = f"{randint(1, 999):03d}" return f"{triplet}-{number}" equipment = Equipment( hostname=random_hostname(), type="Server", ip_address=random_ipv4(), is_active=True, latency=12.5, interfaces=[ Interface(port=22, service="SSH"), Interface(port=443, service="HTTPS"), ], ) session.add(equipment) session.commit() stmt = select(Equipment) for eq in session.execute(stmt).scalars(): print(f"{eq.hostname} ({eq.ip_address})") for iface in eq.interfaces: print(f" - port {iface.port} : {iface.service}")