Semaine 7

This commit is contained in:
gauvainboiche
2026-03-20 21:26:23 +01:00
parent 74d0c3f75b
commit 606e43e53f
69 changed files with 2343 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=MementoMarsouin96
DB_NAME=company
DB_PORT=3306

View File

@@ -0,0 +1 @@
3.12

View File

@@ -0,0 +1,11 @@
Normalement, on met aussi un fichier
`.gitignore`
Dont le contenu mentionne :
```
*.env
```
Pour l'exercice évidemment, je garde le fichier en clair.

View File

@@ -0,0 +1,19 @@
services:
mysql:
image: mysql:8.0
container_name: mysql_peewee
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
command: --log_bin_trust_function_creators=1
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql_data:

View File

@@ -0,0 +1,123 @@
from peewee import *
# import os
# from dotenv import load_dotenv
# load_dotenv()
# db_name = os.environ.get("DB_NAME")
# db_user = os.environ.get("DB_USER")
# db_password = os.environ.get("DB_PASSWORD")
# db_host = os.environ.get("DB_HOST")
# db_port = os.environ.get("DB_PORT")
db_name = "company"
db_user = "root"
db_password = "MementoMarsouin96"
db_host = "localhost"
db_port = 3306
db = MySQLDatabase(
database= db_name,
user= db_user,
password= db_password,
host= db_host,
port= db_port
)
# équivalent de "Base = declarative_base()"
class BaseModel(Model):
class Meta:
database = db
class Department(BaseModel):
department_id = AutoField(primary_key= True)
department_name = CharField(max_length= 50, null= False, unique= True)
location_id = DecimalField(max_digits= 4, decimal_places= 0, null= False)
# équivalent de "__tablename__ = "truc""
class Meta:
table_name = "departments"
class Employee(BaseModel):
employee_id = AutoField(primary_key= True)
first_name = CharField(max_length= 50, null= False)
last_name = CharField(max_length= 50, null= False)
email = CharField(max_length= 50, null= False, unique= True)
salary = IntegerField(null= False)
department = ForeignKeyField(Department, backref= "employees", null= False)
class Meta:
table_name = "employees"
db.connect()
db.create_tables([Department, Employee])
try:
it_dept = Department.create(department_name= "IT", location_id= 1400)
except IntegrityError:
print("Département déjà existant.")
it_dept = Department.get(Department.department_name == "IT")
try:
Employee.create(
first_name= "Alice",
last_name= "Smith",
email= "a.smith@company.au",
salary= 4000,
department= it_dept # utiliser l'OBJET, pas le nom de l'objet
)
except IntegrityError:
print("Employé(e) déjà existant(e).")
new_employees = [
{'first_name': 'Marie', 'last_name': 'Dupont', 'email': 'mdupont', 'salary': 4500},
{'first_name': 'Jean', 'last_name': 'Martin', 'email': 'jmartin', 'salary': 5200},
{'first_name': 'Sophie', 'last_name': 'Bernard', 'email': 'sbernard', 'salary': 4800},
]
# with db.atomic():
# Employee.insert_many(new_employees).execute()
employee_01 = Employee.get(1)
print(employee_01.first_name, employee_01.last_name)
employee_02 = Employee.get(Employee.email == "a.smith@company.au")
print(employee_02.first_name, employee_02.salary)
try:
employee_76 = Employee.get(76)
except DoesNotExist:
print("L'employé(e) 76 n'existe pas.")
employee_select_01 = Employee.select() # SELECT * FROM employees
print(employee_select_01)
for employee in employee_select_01:
print(employee.first_name, employee.last_name, employee.email)
employee_select_02 = Employee.select().where(
(Employee.salary > 8000) & (Employee.department == it_dept)
)
print(employee_select_02)
# pagination
page_01 = Employee.select().order_by(Employee.employee_id).paginate(1, 10)
# compter une valeur
salary_01 = Employee.select().where(Employee.salary > 10000).count()
# Jointures (LEFT JOIN, RIGHT JOIN etc)
### FULL JOIN
query = (Employee
.select(Employee, Department)
.join(Department)
.where(Department.department_name == "IT"))
### Employés affectés à un département
### et ceux non affectés à un département
query = (Employee
.select(Employee, Department)
.join(Department, JOIN.LEFT_OUTER)
.where(Department.department_name == "IT"))

View File

@@ -0,0 +1,10 @@
[project]
name = "orm-peewee"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"peewee>=4.0.2",
"pymysql>=1.1.2",
]

View File

@@ -0,0 +1,105 @@
from peewee import *
# import os
# from dotenv import load_dotenv
# load_dotenv()
# db_name = os.environ.get("DB_NAME")
# db_user = os.environ.get("DB_USER")
# db_password = os.environ.get("DB_PASSWORD")
# db_host = os.environ.get("DB_HOST")
# db_port = os.environ.get("DB_PORT")
db_name = "company"
db_user = "root"
db_password = "MementoMarsouin96"
db_host = "localhost"
db_port = 3306
db = MySQLDatabase(
database= db_name,
user= db_user,
password= db_password,
host= db_host,
port= db_port
)
# équivalent de "Base = declarative_base()"
class BaseModel(Model):
class Meta:
database = db
# Relations One-To-Many
class User(BaseModel):
username = CharField(unique= True)
email = CharField()
class Meta:
table_name = "user"
class Todo(BaseModel):
title = CharField()
is_done = BooleanField(default= False)
user= ForeignKeyField(User, backref= "todos") # l'accès inverse est géré automatiquement
class Meta:
table_name = "todos"
class Tag(BaseModel):
name = CharField(unique= True)
class Meta:
table_name = "tag"
class TodoTag(BaseModel):
todo = ForeignKeyField(Todo)
tag = ForeignKeyField(Tag)
class Meta:
table_name = 'todo_tag'
indexes= (
(('todo', 'tag'), True),
)
class Profile(BaseModel):
user = ForeignKeyField(User, unique= True, backref= "profile") # One-To-One
bio = TextField(null= True)
avatar = CharField(null= True)
class Meta:
table_name = "profile"
db.connect()
db.create_tables([User, Todo, Profile, Tag, TodoTag])
try:
alice = User.create(username= "Alice", email= "a.smith@company.au")
Todo.create(title= "Apprendre Python", user= alice)
Todo.create(title= "Apprendre JS", user= alice)
Todo.create(title= "Apprendre COBOL", user= alice)
for todo in alice.todos:
print(todo.title, todo.is_done)
except IntegrityError as error:
print(error)
try:
Profile.create(
user= User.get(1),
bio = 'Developpeur',
avatar= 'http://example.com'
)
except IntegrityError as error:
print(error)
try:
tag_urgent = Tag.create(name= "Urgent")
tag_perso = Tag.create(name= "Perso")
tag_pro = Tag.create(name= "Pro")
todo_cobol = Todo.get(Todo.title == "Apprendre COBOL")
TodoTag.create(todo= todo_cobol, tag= tag_urgent)
except IntegrityError as error:
print(error)

36
Semaine_07/Jour_05/orm_peewee/uv.lock generated Normal file
View File

@@ -0,0 +1,36 @@
version = 1
revision = 3
requires-python = ">=3.12"
[[package]]
name = "orm-peewee"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "peewee" },
{ name = "pymysql" },
]
[package.metadata]
requires-dist = [
{ name = "peewee", specifier = ">=4.0.2" },
{ name = "pymysql", specifier = ">=1.1.2" },
]
[[package]]
name = "peewee"
version = "4.0.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/54/9b/3439dcc3ed5138eb26f28fc208f958ca97b831f5f898b26d5354302e5df4/peewee-4.0.2.tar.gz", hash = "sha256:fd5d026ce7787c6cd3a84316e665a76b72c9c4e87322598c413f44604fa6c38d", size = 714081, upload-time = "2026-03-15T15:46:30.049Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/4f/8e/943f57ce32eb005c7037110a759e2ebfb22e467a9a0efcb6d516c5bf00c6/peewee-4.0.2-py3-none-any.whl", hash = "sha256:86d5d16bcda5bbe017a108f6efc57abaac8d89277915541904542df9d2a7f25d", size = 143344, upload-time = "2026-03-15T15:46:28.778Z" },
]
[[package]]
name = "pymysql"
version = "1.1.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f5/ae/1fe3fcd9f959efa0ebe200b8de88b5a5ce3e767e38c7ac32fb179f16a388/pymysql-1.1.2.tar.gz", hash = "sha256:4961d3e165614ae65014e361811a724e2044ad3ea3739de9903ae7c21f539f03", size = 48258, upload-time = "2025-08-24T12:55:55.146Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7c/4c/ad33b92b9864cbde84f259d5df035a6447f91891f5be77788e2a3892bce3/pymysql-1.1.2-py3-none-any.whl", hash = "sha256:e6b1d89711dd51f8f74b1631fe08f039e7d76cf67a42a323d3178f0f25762ed9", size = 45300, upload-time = "2025-08-24T12:55:53.394Z" },
]