Files
gauvainboiche 0d071d2843 Semaine 11
2026-07-11 21:38:00 +02:00

94 lines
2.9 KiB
Python

"""
**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}")