Skip to content
Snippets Groups Projects
Commit 877fe245 authored by BRAUX Emmanuel's avatar BRAUX Emmanuel
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
ARG BASE_CONTAINER=jupyter/minimal-notebook
FROM $BASE_CONTAINER
LABEL maintainer="Emmnanuel Braux <emmanuel.braux@imt-atlantique.fr>"
USER root
# postgres
RUN apt-get update && apt-get install -y ca-certificates wget lsb-release gnupg &&\
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - &&\
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/PostgreSQL.list && \
apt-get update && \
apt-get install -y postgresql-10 postgresql-contrib && \
rm -rf /var/lib/apt/lists/*
RUN echo "jovyan ALL=(postgres) NOPASSWD: ALL" >> /etc/sudoers
RUN chmod 777 /var/run/postgresql
USER $NB_UID
# Install Python 3 packages
RUN conda install --quiet --yes \
# 'beautifulsoup4=4.8.*' \
# 'conda-forge::blas=*=openblas' \
# 'bokeh=1.4.*' \
# 'cloudpickle=1.3.*' \
'sqlalchemy=1.3.*' \
'ipython-sql' \
'psycopg2' \
# 'pprint' \
'pgspecial' \
&& \
conda clean --all -f -y && \
#npm cache clean --force && \
rm -rf /home/$NB_USER/.cache/yarn && \
rm -rf /home/$NB_USER/.node-gyp && \
fix-permissions $CONDA_DIR && \
fix-permissions /home/$NB_USER
USER $NB_UID
# Init env pour postgres et sa BDD locale
RUN echo '# Répertoire données de PostgreSQL \n\
export PGDATA=$HOME/work/.postgreSQL_datas' >> $HOME/.bashrc
RUN echo '# Ajout au PATH des exécutables PostgreSQL \n\
export PATH=/usr/lib/postgresql/10/bin/:$PATH' >> $HOME/.bashrc
USER root
COPY entrypoint.sh /srv/entrypoint.sh
RUN chown -R jovyan:users /srv/entrypoint.sh && \
chmod +x /srv/entrypoint.sh
COPY initialisation.sh /srv/initialisation.sh
RUN chown -R jovyan:users /srv/initialisation.sh && \
chmod +x /srv/initialisation.sh
COPY install_database_soins.sql /srv/install_database_soins.sql
RUN chown -R jovyan:users /srv/install_database_soins.sql
COPY notebooks latest/notebooks/
RUN chown -R jovyan:users latest/notebooks/
RUN chown -R jovyan:users latest && \
find latest -type f -iname "*" -print0 | xargs -I {} -0 chmod 0444 {} && \
find latest -type d -iname "*" -print0 | xargs -I {} -0 chmod 0544 {}
COPY notebooks work/notebooks/
RUN chown -R jovyan:users work/notebooks/
USER $NB_UID
ENTRYPOINT ["tini", "--", "/srv/entrypoint.sh"]
CMD ["start-singleuser.sh"]
# changement d'utilisateur pour sécuriser
USER $NB_UID
#!/bin/bash
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
set -e
# If the run command is the default, do some initialization first
if [ "$(which "$1")" = "/usr/local/bin/start-singleuser.sh" ]; then
# # Clone sample notebooks to user's notebook directory. Assume $NB_USER's work
# # directory if notebook directory not explicitly set. `git clone` will fail
# # if target directory already exists and is not empty, which likely means
# # that we've already done it, so just ignore.
# : ${NOTEBOOK_DIR:=/home/$NB_USER/work}
# git clone https://gist.github.com/parente/facb555dfbae28e817e0 \
# --depth 1 \
# "$NOTEBOOK_DIR/notebook_count" || true
export PGDATA=$HOME/work/.postgreSQL_datas
export PATH=/usr/lib/postgresql/10/bin/:$PATH
# reinitialisation de la base
if [ -f "$HOME/work/resetdb" ];then
rm -rf $PGDATA
rm $HOME/work/resetdb
fi
# Création du répertoire des données de PostgreSQL
if [ ! -d "$PGDATA" ];then
mkdir -p $PGDATA
fi
if [ -z "$(ls -A "$PGDATA")" ]; then
## Initialisation
# gosu postgres initdb
initdb --username=postgres
fi
# Démarrage du serveur PostgreSQL
pg_ctl start
# initialisation
source /srv/initialisation.sh
fi
# Run the command provided
exec "$@"
#!/bin/bash
if [ -z "$(psql --username=postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='user_tp'")" ]; then
# Création de l'utilisateur user_tp, le mot de passe n'est pas très utile...
psql --username=postgres -c "create role user_tp with login password 'abc' nosuperuser inherit nocreatedb nocreaterole noreplication;"
# Création de la base ue_bd_ihm_db attribuée à l'utilisateur user_tp
psql --username=postgres -c "create database ue_bd_ihm_db with owner=user_tp;"
# Exécution du script SQL de création des tables
psql -U user_tp -d ue_bd_ihm_db -f /srv/install_database_soins.sql
fi
-- Titre : install_database_soins.sql
-- Version : 0.2
-- Date création : 10 octobre 2018
-- Date modification : 6 mars 2019
-- Auteur : Philippe Tanguy & Laurent Brisson
-- Description :
-- +----------------------------------------------------------------------------------------------+
-- | Tables drop |
-- +----------------------------------------------------------------------------------------------+
drop table if exists prescription;
drop table if exists visite;
drop table if exists patient;
drop table if exists medecin;
-- +----------------------------------------------------------------------------------------------+
-- | Tables creation |
-- +----------------------------------------------------------------------------------------------+
create table medecin
(
medecin_id serial primary key,
rpps varchar(12) not null,
nom varchar(20) not null,
prenom varchar(20),
adresse varchar(256),
telephone varchar(15),
specialite varchar(20)
);
create table patient
(
patient_id serial primary key,
numsecu varchar(15),
genre varchar(10),
date_naissance varchar(20),
nom varchar(20) not null,
prenom varchar(20),
rattachement integer references patient,
medecin_referent integer references medecin
);
create table visite
(
medecin integer,
patient integer,
date_visite date,
prix real,
constraint pk_visite primary key(medecin, patient, date_visite),
constraint fk_medecin foreign key(medecin) references medecin,
constraint fk_patient foreign key(patient) references patient
);
create table prescription
(
ordonnance_id integer,
medicament varchar(30),
medecin integer,
patient integer,
date_visite date,
duree integer,
posologie real,
modalites varchar(256),
constraint pk_prescription primary key(ordonnance_id, medicament),
constraint fk_visite foreign key(medecin, patient, date_visite) references visite
);
-- +----------------------------------------------------------------------------------------------+
-- | Some data for testing purpose |
-- +----------------------------------------------------------------------------------------------+
-- Doctors
insert into medecin values (DEFAULT, '100000000001', 'Grey', 'Meredith', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000002', 'Shepherd', 'Derek', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000003', 'Karev', 'Alex', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000004', 'Stevens', 'Izzie', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000005', 'Bailey', 'Miranda', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000006', 'Webber', 'Richard', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Généraliste');
insert into medecin values (DEFAULT, '100000000007', 'Yang', 'Cristina', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Dermatologue');
insert into medecin values (DEFAULT, '100000000008', 'Omalley', 'George', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Chirurgien');
insert into medecin values (DEFAULT, '100000000009', 'Burke', 'Preston', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Chirurgien');
insert into medecin values (DEFAULT, '100000000010', 'Montgomery-Shepherd', 'Addison', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Cardiologue');
insert into medecin values (DEFAULT, '100000000011', 'Torres', 'Callie', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Dermatologue');
insert into medecin values (DEFAULT, '100000000012', 'Sloan', 'Mark', 'Centre Hospitalier Régional et Universitaire de Brest', '02 98 22 33 33', 'Allergologue');
-- Patients
insert into patient values (DEFAULT, '1690529012561', 'Male', '22/05/1969','Dempsey', 'Justin', null, 1);
insert into patient values (DEFAULT, '2080229931002', 'Female', '01/02/2008', 'Dempsey', 'Ellen', 1, 1);
insert into patient values (DEFAULT, '1990329028069', 'Male', '02/03/1999', 'Dempsey', 'Patrick', 1, 1);
insert into patient values (DEFAULT, '1560935006999', 'Male', '12/09/1956', 'Knight', 'T.R.', null, 2);
insert into patient values (DEFAULT, '2170335112001', 'Female', '02/03/2017', 'Knight', 'Katherine', 4, 1);
insert into patient values (DEFAULT, '2991135006001', 'Female', '05/11/1999', 'Knight', 'Sandra', 4, 4);
insert into patient values (DEFAULT, '2060835112059', 'Female', '25/08/2006', 'Knight', 'Kate', 4, null);
insert into patient values (DEFAULT, '1100135112456', 'Male', '17/01/2010', 'Knight', 'Isaiah', 4, null);
insert into patient values (DEFAULT, '1690672111035', 'Male', '24/06/1969', 'Dane', 'Eric', null, null);
insert into patient values (DEFAULT, '1800899112023', 'Male', '24/08/1980', 'Dane', 'James Jr.', 9, 2);
insert into patient values (DEFAULT, '2410606006006', 'Female', '21/06/1941', 'Ramirez', 'Sara', null, 2);
insert into patient values (DEFAULT, '2010106006956', 'Female', '12/01/2001', 'Ramirez', 'Chandra', 11, null);
-- Visites
insert into visite values (1, 1, to_date('02/01/2018','dd/mm/yyyy'), 23);
insert into visite values (1, 2, to_date('15/01/2018','dd/mm/yyyy'), 23);
insert into visite values (1, 2, to_date('22/01/2018','dd/mm/yyyy'), 23);
insert into visite values (1, 3, to_date('02/01/2018','dd/mm/yyyy'), 23);
insert into visite values (1, 3, to_date('12/01/2018','dd/mm/yyyy'), 23);
insert into visite values (1, 3, to_date('22/01/2018','dd/mm/yyyy'), 23);
insert into visite values (11,4, to_date('01/01/2018','dd/mm/yyyy'), 23);
insert into visite values (11,4, to_date('15/01/2018','dd/mm/yyyy'), 23);
insert into visite values (11,4, to_date('21/01/2018','dd/mm/yyyy'), 23);
insert into visite values (11,4, to_date('31/01/2018','dd/mm/yyyy'), 23);
insert into visite values ( 3,10, to_date('01/01/2018','dd/mm/yyyy'), 23);
insert into visite values ( 4,10, to_date('11/01/2018','dd/mm/yyyy'), 23);
insert into visite values ( 5,10, to_date('21/01/2018','dd/mm/yyyy'), 23);
insert into visite values ( 6,10, to_date('31/01/2018','dd/mm/yyyy'), 23);
insert into visite values (4, 6, to_date('02/01/2018','dd/mm/yyyy'), 23);
insert into visite values (5, 6, to_date('02/01/2018','dd/mm/yyyy'), 30);
insert into visite values (1, 6, to_date('02/01/2018','dd/mm/yyyy'), 23);
insert into visite values (10,6, to_date('05/01/2018','dd/mm/yyyy'), 70);
insert into visite values (4, 6, to_date('05/01/2018','dd/mm/yyyy'), 23);
insert into visite values (11,6, to_date('07/01/2018','dd/mm/yyyy'), 40);
insert into visite values (12,6, to_date('07/01/2018','dd/mm/yyyy'), 23);
insert into visite values (12,6, to_date('09/01/2018','dd/mm/yyyy'), 40);
insert into visite values (6, 8, to_date('09/01/2018','dd/mm/yyyy'), 23);
insert into visite values (6, 8, to_date('19/01/2018','dd/mm/yyyy'), 23);
insert into visite values (6, 8, to_date('23/01/2018','dd/mm/yyyy'), 23);
insert into visite values (6, 8, to_date('27/01/2018','dd/mm/yyyy'), 23);
insert into visite values (5, 9, to_date('27/01/2018','dd/mm/yyyy'), 30);
insert into visite values (7, 9, to_date('27/01/2018','dd/mm/yyyy'), 40);
insert into visite values (8, 9, to_date('27/01/2018','dd/mm/yyyy'), 23);
insert into visite values (9, 9, to_date('27/01/2018','dd/mm/yyyy'), 23);
insert into visite values (10,9, to_date('27/01/2018','dd/mm/yyyy'), 70);
insert into visite values (11,9, to_date('27/01/2018','dd/mm/yyyy'), 40);
insert into visite values (12,9, to_date('27/01/2018','dd/mm/yyyy'), 40);
-- Prescriptions
insert into prescription values(1, 'ventoline', 1, 3, to_date('02/01/2018', 'dd/mm/yyyy'), 2, 8, '1 bouffée toutes les 3 heures pendant 2 jours');
insert into prescription values(1, 'becotide', 1, 3, to_date('02/01/2018', 'dd/mm/yyyy'), 180, 6, '2 bouffées');
insert into prescription values(2, 'aspégic', 4, 6, to_date('2/01/2018', 'dd/mm/yyyy'), 5, 3, '1 comprimé 3 fois par jour');
insert into prescription values(3, 'ventoline', 12, 6, to_date('07/01/2018', 'dd/mm/yyyy'), 180, 2, '1 bouffée matin et soir');
insert into prescription values(4, 'doliprane 500', 1, 3, to_date('22/01/2018', 'dd/mm/yyyy'), 7, 3, '1 comprimé 3 fois par jour');
insert into prescription values(5, 'ventoline', 6, 8, to_date('23/01/2018', 'dd/mm/yyyy'), 60, 1, 'selon besoins');
insert into prescription values(6, 'ventoline', 12, 9, to_date('27/01/2018', 'dd/mm/yyyy'), 120, 1, 'selon besoins');
insert into prescription values(7, 'doliprane 1000', 5, 9, to_date('27/01/2018', 'dd/mm/yyyy'), 7, 3, '1 comprimé 3 fois par jour');
insert into prescription values(7, 'aspégic', 5, 9, to_date('27/01/2018', 'dd/mm/yyyy'), 7, 1, 'selon la douleur');
\ No newline at end of file
https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml1.fr.files/install_database_soins.sql
https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml1.fr.files/Requ%c3%aates%20simples.ipynb
https://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml2.fr.files/Requ%c3%aates%20avanc%c3%a9es.ipynb
%% Cell type:markdown id: tags:
# TP Requêtes Simples
http://formations.imt-atlantique.fr/bd_ihm/fr/sql/dml1/
**Découvrir le fonctionnement d'un notebook** (si c'est votre premier notebook) :
- Allez dans le menu `Help` et choisissez `User Interface Tour`
- Découvrez tous les raccourcis (si besoin) dans `Help` puis `Keyboard Shorcuts`
**Commandes essentielles** (pour ceux qui veulent aller direct au coeur du sujet) :
- Les flèches directionnelles permettent de monter et descendre
- Un clic dans une celulle la rend active
- `CRTL-Entrée` permet d'exécuter une celulle
- `%%sql` est nécessaire sur la première ligne d'une cellule afin d'écrire une requête SQL
%% Cell type:markdown id: tags:
## Configuration
Cliquez dans la cellule suivante et faites un `CTRL+Entrée` pour l'exécuter :
%% Cell type:code id: tags:
``` python
%reload_ext sql
%sql postgresql://user_tp:ue_bd_ihm_db@localhost/ue_bd_ihm_db
```
%% Cell type:markdown id: tags:
**ATTENTION**
Avant chaque requête vous devez avoir la première ligne de la cellule contenant le code
`%%sql` sinon vous êtes en mode python ! Ce qui peut être très pratique mais n'a pas d'intérêt dans le cadre de cette activité.
%% Cell type:markdown id: tags:
## Description de la base de données
%% Cell type:markdown id: tags:
Les requêtes SQL à exprimer sont relatives à la base de données SOINS constituée des relations dont le schéma est décrit de manière linéaire ci-dessous (les clefs primaires des relations sont <u>soulignées</u>, et les attributs qui référencent une autre relation sont en <span style="border-bottom: 1px #000000 dashed;">soulignement pointillé</span>).
%% Cell type:markdown id: tags:
MEDECIN (<u>medecin_id</u>, rpss, nom, prenom, adresse, telephone, specialite)<br/>
PATIENT (<u>patient_id</u>, numsecu, genre, date_naissance, nom, prenom, <span style="border-bottom: 1px #000000 dashed;">rattachement</span>, <span style="border-bottom: 1px #000000 dashed;">medecin_referent</span>) où *rattachement* référence *PATIENT (patient_id)* et *medecin_referent* référence *MEDECIN (medecin_id)*<br/>
VISITE (<u><span style="border-bottom: 1px #000000 dashed;">medecin</span>, <span style="border-bottom: 1px #000000 dashed;">patient</span>, date_visite</u>, prix) où *medecin* référence *MEDECIN (medecin_id)* et *patient* référence *PATIENT (patient_id)*<br/>
PRESCRIPTION (<u>ordonnance_id, medicament</u>, <span style="border-bottom: 1px #000000 dashed;">medecin, patient, date_visite</span>, duree, posologie, modalites)
où le triplet d'attributs *(medecin, patient, date_visite)* référence *VISITE (medecin, patient, date_visite)*
%% Cell type:markdown id: tags:
Notez que :
- L'attribut *rattachement* de la relation *PATIENT* est renseigné quand une personne (appelée *ayant-droit*) bénéficie de l'assurance maladie, non pas en son nom propre, mais par sa relation avec une autre personne (appelée *assuré*) qui en bénéficie. Par exemple, les enfants sont rattachés à l'un de leurs parents, ce qui leur donne droit à l'assurance maladie.
- L'attribut *medecin_referent* de la relation *PATIENT* désigne le médecin qu'un patient a choisi pour suivre son dossier médical.
- Les attributs *duree* et *posologie* seront traités de manière très simple dans cet exemple : la durée désigne un nombre de jours de traitement et la posologie le nombre de prises par jour.
- Plusieurs lignes de la relation *PRESCRIPTION* peuvent se regrouper en une ordonnance dont l'identifiant est *ordonnance_id*
%% Cell type:markdown id: tags:
La requête suivante vous permet d'explorer la structure d'une table (changez `medecin` par la table de votre choix) :
%% Cell type:code id: tags:
``` python
%%sql
select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where table_name = 'medecin';
```
%% Cell type:markdown id: tags:
**Question 1** : Commencez par représenter graphiquement le schéma logique décrit précédemment.
%% Cell type:markdown id: tags:
## Pattern matching et tris
Avant de commencer, prenez le temps d'observer les enregistrements des différentes tables. Par exemple, la requête suivante :<br/>
`SELECT distinct medicament FROM prescription`<br/>
vous permettra de comprendre comment les médicaments sont orthographiés afin d'effectuer la requête adéquate.
%% Cell type:code id: tags:
``` python
%%sql
SELECT distinct medicament FROM prescription;
```
%% Cell type:markdown id: tags:
**Question 2** : Affichez les ordonnances qui contiennent du "doliprane".
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 3** : Affichez toutes les prescriptions de "ventoline" ordonnées par durée de traitement décroissante.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 4** : Affichez les prescriptions de "ventoline" ayant une durée supérieure à 90 jours.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 5 :** Affichez les prescriptions de “ventoline” effectuées après le 15 janvier 2018 et ayant une durée supérieure à 90 jours.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## Jointures
Lorsque vous réalisez des requêtes avec des jointures, utilisez le plus petit nombre possible de tables nécessaires. On parle généralement de critère de minimalité.<br/>
Parfois il est nécessaire d'utiliser plusieurs fois la même table. On dit alors que cette table a des rôles différents. Utiliser la notion d'alias afin de renommer les tables.
**Question 6** : Affichez les noms des patients et les identifiants des médecins qu'ils ont visités le 15 janvier 2018.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 7** : Affichez pour chaque ayant-droit, les numéros de sécurité sociale, nom et prénom de l'assuré auquel il est rattaché.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 8** : Affichez les noms des patients et de leur médecin référent.
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 9** : Affichez les personnes qui ont un ayant-droit (en français d’usage courant on veut dire qui ont au moins un ayant-droit).
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## Négation et listes
Un attribut peut être différent d'une valeur : `attribut NOT LIKE chaine` ou `attribut != valeur`
Un attribut peut ne pas avoir de valeur : `attribut IS NULL`
Un attribut peut ne pas être présent dans une liste (donné par un `SELECT` imbriqué par exemple) : `attribut NOT IN (...)`
**Question 10** : Affichez les médecins qui ne sont pas généralistes
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 11** : Affichez les patients qui n'ont pas de médecin référent
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
## Comptages et agrégations
Avant de débuter, exécutez et comparez le résultat rendu par l'ensemble de requêtes suivant :
%% Cell type:code id: tags:
``` python
%%sql
SELECT COUNT(*) AS "Nombre" FROM PATIENT;
```
%% Cell type:code id: tags:
``` python
%%sql
SELECT COUNT(patient_id) AS "Nombre" FROM PATIENT;
```
%% Cell type:code id: tags:
``` python
%%sql
SELECT COUNT(rattachement) AS "Nombre" FROM PATIENT;
```
%% Cell type:code id: tags:
``` python
%%sql
SELECT count(DISTINCT rattachement) AS "Nombre" FROM PATIENT;
```
%% Cell type:markdown id: tags:
**Question 12** : Affichez le nombre total de médecins
%% Cell type:code id: tags:
``` python
%%sql
```
%% Cell type:markdown id: tags:
**Question 13** : Affichez le nombre de médecins par spécialité
%% Cell type:code id: tags:
``` python
%%sql
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment