Semaine 7
This commit is contained in:
5
Semaine_07/Jour_05/orm_peewee/.env
Normal file
5
Semaine_07/Jour_05/orm_peewee/.env
Normal file
@@ -0,0 +1,5 @@
|
||||
DB_HOST=localhost
|
||||
DB_USER=root
|
||||
DB_PASSWORD=MementoMarsouin96
|
||||
DB_NAME=company
|
||||
DB_PORT=3306
|
||||
1
Semaine_07/Jour_05/orm_peewee/.python-version
Normal file
1
Semaine_07/Jour_05/orm_peewee/.python-version
Normal file
@@ -0,0 +1 @@
|
||||
3.12
|
||||
11
Semaine_07/Jour_05/orm_peewee/README.md
Normal file
11
Semaine_07/Jour_05/orm_peewee/README.md
Normal 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.
|
||||
19
Semaine_07/Jour_05/orm_peewee/docker-compose.yml
Normal file
19
Semaine_07/Jour_05/orm_peewee/docker-compose.yml
Normal 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:
|
||||
123
Semaine_07/Jour_05/orm_peewee/main.py
Normal file
123
Semaine_07/Jour_05/orm_peewee/main.py
Normal 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"))
|
||||
10
Semaine_07/Jour_05/orm_peewee/pyproject.toml
Normal file
10
Semaine_07/Jour_05/orm_peewee/pyproject.toml
Normal 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",
|
||||
]
|
||||
105
Semaine_07/Jour_05/orm_peewee/relations.py
Normal file
105
Semaine_07/Jour_05/orm_peewee/relations.py
Normal 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
36
Semaine_07/Jour_05/orm_peewee/uv.lock
generated
Normal 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" },
|
||||
]
|
||||
Reference in New Issue
Block a user