Skip to content

Commit 4315a77

Browse files
committed
Ecrire toutes les tables DBT dans le schema warehouse
1 parent bb96dfa commit 4315a77

File tree

53 files changed

+341
-131
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+341
-131
lines changed

.secrets.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@
142142
"filename": "core/settings.py",
143143
"hashed_secret": "1ee34e26aeaf89c64ecc2c85efe6a961b75a50e9",
144144
"is_verified": false,
145-
"line_number": 275
145+
"line_number": 276
146146
}
147147
],
148148
"dbt/package-lock.yml": [
@@ -191,5 +191,5 @@
191191
}
192192
]
193193
},
194-
"generated_at": "2025-04-24T11:22:55Z"
194+
"generated_at": "2025-05-07T11:42:45Z"
195195
}

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ dump-production:
146146
.PHONY: load-production-dump
147147
load-production-dump:
148148
@DUMP_FILE=$$(find tmpbackup -type f -name "*.pgsql" -print -quit); \
149-
pg_restore -d "$(DB_URL)" --clean --no-acl --no-owner --no-privileges "$$DUMP_FILE" || true
149+
psql -d "$(DB_URL)" -c "CREATE EXTENSION IF NOT EXISTS postgis;" && \
150+
psql -d "$(DB_URL)" -c 'CREATE EXTENSION IF NOT EXISTS "unaccent";' && \
151+
psql -d "$(DB_URL)" -c 'CREATE EXTENSION IF NOT EXISTS "pg_trgm";' && \
152+
psql -d "$(DB_URL)" -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' && \
153+
pg_restore -d "$(DB_URL)" --schema=public --clean --no-acl --no-owner --no-privileges "$$DUMP_FILE" || true
150154
rm -rf tmpbackup
151155

152156
.PHONY: db-restore

core/models/tools.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
logger = logging.getLogger(__name__)
66

77

8-
def compare_model_vs_table(cls, table_name: str) -> bool:
8+
def compare_model_vs_table(cls, db_schema: str, table_name: str) -> bool:
99

1010
def are_fields_matched(db_type, model_type):
1111
logger.info(f"Comparing {db_type} with {model_type}")
@@ -26,8 +26,10 @@ def are_fields_matched(db_type, model_type):
2626
with connection.cursor() as cursor:
2727

2828
table_info = connection.introspection.get_table_list(cursor)
29+
for table in table_info:
30+
logger.info(f"Table: {table}")
2931
if not any(table.name == table_name for table in table_info):
30-
logger.error(f"La table {table_name} n'existe pas")
32+
logger.error(f"La table {db_schema}.{table_name} n'existe pas")
3133
return False
3234

3335
table_description = connection.introspection.get_table_description(
@@ -128,6 +130,8 @@ def are_fields_matched(db_type, model_type):
128130
through_model = field.remote_field.through
129131
through_table = through_model._meta.db_table
130132
through_table = through_table.replace(cls_table, table_name)
131-
all_fields_match &= compare_model_vs_table(through_model, through_table)
133+
all_fields_match &= compare_model_vs_table(
134+
through_model, db_schema, through_table
135+
)
132136

133137
return all_fields_match

core/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ def context_processors():
266266
)
267267
default_settings = dj_database_url.parse(DATABASE_URL)
268268
default_settings["ENGINE"] = "django.contrib.gis.db.backends.postgis"
269+
default_settings["OPTIONS"] = {"options": "-c search_path=public,warehouse"}
269270

270271
# The readonly access is configured with fake access when DB_READONLY env
271272
# variable is not set.

dags/.env.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@ POSTGRES_PORT=5432
5959
POSTGRES_USER=qfdmo
6060
POSTGRES_PASSWORD=qfdmo
6161
POSTGRES_DB=qfdmo
62-
POSTGRES_SCHEMA=public
62+
POSTGRES_SCHEMA=warehouse

dags/acteurs/dags/compute_acteur.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,15 @@
123123
)
124124

125125
check_model_table_displayedacteur_task = check_model_table_consistency_task(
126-
dag, "DisplayedActeur", "exposure_carte_acteur"
126+
dag, "qfdmo", "DisplayedActeur", "warehouse", "exposure_carte_acteur"
127127
)
128128
check_model_table_displayedpropositionservice_task = (
129129
check_model_table_consistency_task(
130-
dag, "DisplayedPropositionService", "exposure_carte_propositionservice"
130+
dag,
131+
"qfdmo",
132+
"DisplayedPropositionService",
133+
"warehouse",
134+
"exposure_carte_propositionservice",
131135
)
132136
)
133137
# The publication isn't handled by DBT yet
@@ -136,13 +140,17 @@
136140
# )
137141

138142
check_model_table_vueacteur_task = check_model_table_consistency_task(
139-
dag, "VueActeur", "exposure_exhaustive_acteur"
143+
dag, "qfdmo", "VueActeur", "warehouse", "exposure_exhaustive_acteur"
140144
)
141145
check_model_table_vuepropositionservice_task = check_model_table_consistency_task(
142-
dag, "VuePropositionService", "exposure_exhaustive_propositionservice"
146+
dag,
147+
"qfdmo",
148+
"VuePropositionService",
149+
"warehouse",
150+
"exposure_exhaustive_propositionservice",
143151
)
144152
replace_vueacteur_table_task = replace_acteur_table_task(
145-
dag, "qfdmo_vue", "exposure_exhaustive_"
153+
dag, "public", "qfdmo_vue", "warehouse", "exposure_exhaustive_"
146154
)
147155

148156
# Définir la séquence principale

dags/acteurs/tasks/airflow_logic/check_model_table_consistency_task.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from airflow import DAG
99
from airflow.exceptions import AirflowFailException
1010
from airflow.operators.python import PythonOperator
11+
1112
from utils import logging_utils as log
1213

1314
logger = logging.getLogger(__name__)
@@ -30,30 +31,41 @@ def task_info_get(model_name, table_name):
3031

3132

3233
def check_model_table_consistency_wrapper(
33-
ti, params, *, model_name: str, table_name: str
34+
ti, params, *, django_app: str, model_name: str, db_schema: str, table_name: str
3435
) -> None:
3536
# model_name = "DisplayedActeur"
3637
# table_name = "exposure_carte_acteur"
3738
logger.info(task_info_get(model_name, table_name))
3839

3940
log.preview("Modèle Django", model_name)
4041
log.preview("Table", table_name)
41-
if not check_model_table_consistency(model_name=model_name, table_name=table_name):
42+
if not check_model_table_consistency(
43+
django_app=django_app,
44+
model_name=model_name,
45+
db_schema=db_schema,
46+
table_name=table_name,
47+
):
4248
raise AirflowFailException(
4349
f"le modèle {model_name} ne correspond pas à la table {table_name}"
4450
)
4551

4652

4753
def check_model_table_consistency_task(
48-
dag: DAG, model_name: str, table_name: str
54+
dag: DAG,
55+
django_app: str,
56+
model_name: str,
57+
db_schema: str,
58+
table_name: str,
4959
) -> PythonOperator:
5060
task_name = f"check_{model_name}_vs_{table_name}_consistency"
5161
return PythonOperator(
5262
task_id=task_name,
5363
python_callable=check_model_table_consistency_wrapper,
5464
dag=dag,
5565
op_kwargs={
66+
"django_app": django_app,
5667
"model_name": model_name,
68+
"db_schema": db_schema,
5769
"table_name": table_name,
5870
},
5971
)

dags/acteurs/tasks/airflow_logic/replace_acteur_table_task.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from acteurs.tasks.business_logic.replace_acteur_table import replace_acteur_table
66
from airflow import DAG
77
from airflow.operators.python import PythonOperator
8+
89
from utils import logging_utils as log
910

1011
logger = logging.getLogger(__name__)
@@ -30,25 +31,42 @@ def task_info_get(prefix_django: str, prefix_dbt: str):
3031

3132

3233
def replace_acteur_table_wrapper(
33-
ti, params, *, prefix_django: str, prefix_dbt: str
34+
ti,
35+
params,
36+
*,
37+
schema_django: str,
38+
prefix_django: str,
39+
schema_dbt: str,
40+
prefix_dbt: str,
3441
) -> None:
3542
logger.info(task_info_get(prefix_django, prefix_dbt))
3643

3744
log.preview("Préfixe des tables du modèle Django", prefix_django)
3845
log.preview("Préfixe des tables calculées par DBT", prefix_dbt)
39-
replace_acteur_table(prefix_django=prefix_django, prefix_dbt=prefix_dbt)
46+
replace_acteur_table(
47+
schema_django=schema_django,
48+
prefix_django=prefix_django,
49+
schema_dbt=schema_dbt,
50+
prefix_dbt=prefix_dbt,
51+
)
4052

4153

4254
def replace_acteur_table_task(
43-
dag: DAG, prefix_django: str, prefix_dbt: str
55+
dag: DAG,
56+
schema_django: str,
57+
prefix_django: str,
58+
schema_dbt: str,
59+
prefix_dbt: str,
4460
) -> PythonOperator:
4561
task_name = f"replace_{prefix_django}_by_{prefix_dbt}_table"
4662
return PythonOperator(
4763
task_id=task_name,
4864
python_callable=replace_acteur_table_wrapper,
4965
dag=dag,
5066
op_kwargs={
67+
"schema_django": schema_django,
5168
"prefix_django": prefix_django,
69+
"schema_dbt": schema_dbt,
5270
"prefix_dbt": prefix_dbt,
5371
},
5472
)

dags/acteurs/tasks/business_logic/check_model_table_consistency.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
django_setup_full()
44

55

6-
def check_model_table_consistency(*, model_name: str, table_name: str) -> bool:
6+
def check_model_table_consistency(
7+
*,
8+
django_app: str,
9+
model_name: str,
10+
db_schema: str,
11+
table_name: str,
12+
) -> bool:
713

814
from django.apps import apps
915

1016
from core.models.tools import compare_model_vs_table
1117

12-
model_class = apps.get_model("qfdmo", model_name)
13-
return compare_model_vs_table(model_class, table_name)
18+
model_class = apps.get_model(django_app, model_name)
19+
return compare_model_vs_table(model_class, db_schema, table_name)

dags/acteurs/tasks/business_logic/replace_acteur_table.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88

99

1010
def replace_acteur_table(
11-
prefix_django="qfdmo_displayed",
12-
prefix_dbt="exposure_carte_",
11+
schema_django: str,
12+
prefix_django: str,
13+
schema_dbt: str,
14+
prefix_dbt: str,
1315
tables=[
1416
"acteur",
1517
"acteur_acteur_services",
@@ -26,6 +28,15 @@ def replace_acteur_table(
2628
cursor.execute("BEGIN")
2729
try:
2830
for table in tables:
31+
logger.warning(
32+
f"Update schema of {prefix_dbt}{table} from {schema_dbt}"
33+
f" to {schema_django}"
34+
)
35+
cursor.execute(
36+
f"ALTER TABLE {schema_dbt}.{prefix_dbt}{table}"
37+
f" SET SCHEMA {schema_django}"
38+
)
39+
2940
logger.warning(
3041
f"Renaming {prefix_django}{table}"
3142
f" to {prefix_django}{table}_to_remove"

0 commit comments

Comments
 (0)