Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions .github/workflows/check_code_quality.yaml
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
name: check_code_quality
on: pull_request
jobs:
black: # mettre le nom qu'on souhaite ici
runs-on: ubuntu-20.04
name: code quality

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.9
- run: | #bash multi-lignes
python -m pip install --upgrade pip
pip install black
- run: |
black --check --verbose .
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Check formatting
run: uvx ruff format --check .

- name: Check linting
run: uvx ruff check .
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
venv/
.venv/
data/
__pycache__
test.py
test.py
*.duckdb
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.13
93 changes: 93 additions & 0 deletions Exercises.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# Source de vérité unique pour tous les exercices SQLingo.
# Pour ajouter un exercice : ajouter un bloc ici + le fichier .sql correspondant.
#
# Champs :
# theme : catégorie de l'exercice (utilisé pour grouper)
# name : identifiant unique de l'exercice
# tables : tables DuckDB nécessaires (pour affichage uniquement)
# answer : nom du fichier SQL solution dans Exercices/answers/<theme>/

- theme: cross_joins
name: cross_joins_1
tables: [beverages, food_items]
answer: cross_joins_1.sql

- theme: cross_joins
name: cross_joins_2
tables: [sizes, trademarks]
answer: cross_joins_2.sql

- theme: cross_joins
name: cross_joins_3
tables: [hours, quarters]
answer: cross_joins_3.sql

- theme: inner_joins
name: inner_joins_1
tables: [salaries, seniorities]
answer: inner_joins_1.sql

- theme: left_joins
name: left_joins_1
tables: [products, order_details]
answer: left_joins_1.sql

- theme: left_joins
name: left_joins_2
tables: [orders, customers, products, order_details]
answer: left_joins_2.sql

- theme: full_outer_joins
name: full_outer_joins_1
tables: [df_store_products, df_products]
answer: full_outer_joins_1.sql

- theme: full_outer_joins
name: full_outer_joins_2
tables: [df_customers, df_stores, df_store_products, df_products]
answer: full_outer_joins_2.sql

- theme: self_joins
name: self_joins_1
tables: [employees]
answer: self_joins_1.sql

- theme: self_joins
name: self_joins_2
tables: [sales]
answer: self_joins_2.sql

- theme: group_by
name: group_by_1
tables: [ventes_immo]
answer: group_by_1.sql

- theme: group_by
name: group_by_2
tables: [ventes]
answer: group_by_2.sql

- theme: case_when
name: case_when_1
tables: [salaires]
answer: case_when_1.sql

- theme: case_when
name: case_when_2
tables: [discount]
answer: case_when_2.sql

- theme: case_when
name: case_when_3
tables: [salaires]
answer: case_when_3.sql

- theme: grouping_set
name: grouping_set_1
tables: [redbull]
answer: grouping_set_1.sql

- theme: grouping_set
name: grouping_set_2
tables: [datapop]
answer: grouping_set_2.sql
16 changes: 16 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
.PHONY: install init run start reset

install:
uv sync

init:
uv run db.py

run:
uv run streamlit run app.py

start: install init run

reset:
rm -f data/exercises_sql_tables.duckdb
uv run db.py
71 changes: 56 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,65 @@
# 😎 SQLingo

# SRS - Spaced Repetition System
Entraîne-toi au SQL !

Le **Spaced Repetition System (SRS)** est une technique d'apprentissage qui consiste à augmenter les intervalles de révision entre chaque session de révision pour un même contenu. Cette méthode est basée sur l'effet de la courbe de l'oubli, qui montre comment notre capacité à retenir des informations diminue avec le temps sans révision.
## Comment ça marche

**Utilité :**
- **Efficacité de l'apprentissage :** En révisant les informations juste avant que l'oubli ne commence, le SRS augmente la rétention à long terme des connaissances.
- **Optimisation du temps :** Les utilisateurs passent moins de temps sur des sujets qu'ils maîtrisent déjà et se concentrent davantage sur des domaines moins familiers.
Au lancement, tu sélectionnes les thèmes que tu veux travailler. SQLingo mélange les exercices et te les présente un par un. Si tu réponds correctement, l'exercice disparaît de la queue. Sinon, il revient quelques exercices plus tard. En fin de session, tu vois ton score et la liste des exercices à retravailler.

## Streamlit
## Thèmes disponibles

**Définition :** **Streamlit** est un framework open-source de Python conçu pour créer des applications webs.
- Cross joins, Inner joins, Left joins, Full outer joins, Self joins
- Group by
- Case when
- Grouping sets

**Utilité :**
- **Déploiement rapide :** Permet aux data scientists de transformer des scripts Python en applications web interactives sans nécessiter une expertise approfondie en développement web.
- **Interactivité :** Offre des widgets intégrés pour interagir avec les utilisateurs.
## Stack

## DuckDB
- **[Streamlit](https://streamlit.io/)** — interface web interactive en Python
- **[DuckDB](https://duckdb.org/)** — base de données embarquée pour exécuter les requêtes SQL
- **[uv](https://github.com/astral-sh/uv)** — gestion des dépendances

**DuckDB** est un moteur de base de données embarqué orienté colonnes, conçu pour l'analyse de données OLAP (Online Analytical Processing) sur des systèmes de gestion de base de données relationnelle.
## Choix techniques

**Utilité :**
- **Facilité d'intégration :** Peut être utilisé comme une bibliothèque au sein d'autres applications sans nécessiter de configuration de serveur séparée.
- **Performance optimisée :** Utilise l'exécution de requêtes vectorisées pour améliorer les performances de lecture et d'analyse des données.
**Pas de compte utilisateur.** La progression est gérée entièrement via `st.session_state`. Une queue d'exercices mélangée au démarrage, repositionnée selon les résultats.

**DuckDB comme moteur SQL.** Pas de serveur à configurer, DuckDB tourne directement dans le process Python et exécute des requêtes SQL.

**Une seule source de vérité pour les exercices.** Tous les exercices sont définis dans `exercises.yaml`. Ajouter un exercice ne nécessite pas de toucher au code Python.

**Comparaison order-insensitive.** La vérification des requêtes trie les deux DataFrames avant comparaison — une requête correcte sans `ORDER BY` explicite n'est pas pénalisée.

## Lancer le projet

```bash
make start # install + init DB + lance l'app
```

Les commandes disponibles :

```bash
make install # installe les dépendances (uv sync)
make init # initialise la base de données
make run # lance l'application
make reset # repart d'une DB vierge
```

## Structure

```
SQLingo/
├── app.py # Point d'entrée, routing entre les écrans
├── db.py # Initialisation DB et connexion partagée
├── utils.py # Logique SRS, vérification des requêtes, affichage
├── config.py # Chemins et constantes globales
├── exercises.yaml # Source de vérité pour tous les exercices
└── Exercices/
├── answers/ # Fichiers SQL solution par thème
└── questions/ # Énoncés Markdown par thème
```

## Ajouter un exercice

1. Ajouter un bloc dans `exercises.yaml`
2. Créer le fichier `Exercices/questions/<theme>/<name>.md`
3. Créer le fichier `Exercices/answers/<theme>/<name>.sql`
Loading
Loading