From f07fc1dca9229ea568c17330717da362f81a290c Mon Sep 17 00:00:00 2001 From: timofejmalinin Date: Tue, 26 Sep 2023 20:27:49 +0400 Subject: [PATCH] add create/delete views --- deploy/django.yml | 2 +- .../management/commands/create_procedures.py | 59 +++++++++++++++++++ service/management/commands/create_views.py | 18 ++++++ service/management/commands/delete_views.py | 18 ++++++ service/utils.py | 14 +++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 service/management/commands/create_procedures.py create mode 100644 service/management/commands/create_views.py create mode 100644 service/management/commands/delete_views.py diff --git a/deploy/django.yml b/deploy/django.yml index 5de4d27..0f69d64 100644 --- a/deploy/django.yml +++ b/deploy/django.yml @@ -19,7 +19,7 @@ spec: containers: - name: django image: DEPLOY_IMAGE_TAG - command: ["sh", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:${DJANGO_PORT}"] + command: ["sh", "-c", "python manage.py delete_views && python manage.py migrate && python manage.py create_views && python manage.py runserver 0.0.0.0:${DJANGO_PORT}"] ports: - containerPort: 8000 name: django-port diff --git a/service/management/commands/create_procedures.py b/service/management/commands/create_procedures.py new file mode 100644 index 0000000..7187d78 --- /dev/null +++ b/service/management/commands/create_procedures.py @@ -0,0 +1,59 @@ +from django.core.management.base import BaseCommand +from service.utils import run_sql_command, log_to_telegram + +CMD_PIVOT_DIST = """CREATE OR REPLACE procedure pivot_dist() +--RETURNS SET OF record +AS $BODY$ +DECLARE columnNames TEXT; +BEGIN +DROP VIEW IF EXISTS points_with_dist; +SELECT 'placement_point bigint, ' || string_agg(c, ', ') FROM (SELECT distinct pvz_postamates_group_id, 'd' || pvz_postamates_group_id || ' double precision' as c from service_placementpointpvzdistance order by 1) as asd +INTO columnNames; +EXECUTE format('CREATE OR REPLACE VIEW points_with_dist AS SELECT * +FROM CROSSTAB( + $$ + SELECT placement_point_id, pvz_postamates_group_id, dist + FROM service_placementpointpvzdistance + ORDER BY 1, 2 + $$ +) AS ct(%s) +LEFT JOIN service_placementpoint ON placement_point_id=id' + ,columnNames); +END; +$BODY$ +LANGUAGE plpgsql; +CALL public.pivot_dist();""" + +CMD_PIVOT_DIST_PRE = """CREATE OR REPLACE procedure prepivot_dist() +AS $BODY$ +DECLARE columnNames TEXT; +BEGIN +DROP VIEW IF EXISTS prepoints_with_dist; +SELECT 'placement_point_id bigint, ' || string_agg(c, ', ') FROM (SELECT distinct pvz_postamates_group_id, 'd' || pvz_postamates_group_id || ' double precision' as c from service_preplacementpointpvzdistance order by 1) as asd +INTO columnNames; +EXECUTE format('CREATE OR REPLACE VIEW prepoints_with_dist AS SELECT * +FROM CROSSTAB( + $$ + SELECT placement_point_id, pvz_postamates_group_id, dist + FROM service_preplacementpointpvzdistance + ORDER BY 1, 2 + $$ +) AS ct(%s) +LEFT JOIN service_preplacementpoint ON placement_point_id=id' + ,columnNames); +END; +$BODY$ +LANGUAGE plpgsql; +CALL public.prepivot_dist();""" +class Command(BaseCommand): + help = 'Create procedures' + + def handle(self, *args, **kwargs): + try: + log_to_telegram('Creating views') + run_sql_command(CMD_PIVOT_DIST) + log_to_telegram('pivot_dist created') + run_sql_command(CMD_PIVOT_DIST_PRE) + log_to_telegram('prepivot_dist created') + except Exception as e: + log_to_telegram('Error creating views: ' + str(e)) diff --git a/service/management/commands/create_views.py b/service/management/commands/create_views.py new file mode 100644 index 0000000..af56451 --- /dev/null +++ b/service/management/commands/create_views.py @@ -0,0 +1,18 @@ +from django.core.management.base import BaseCommand +from service.utils import run_sql_command, log_to_telegram + +CMD_PIVOT_DIST = """CALL public.pivot_dist();""" + +CMD_PIVOT_DIST_PRE = """CALL public.prepivot_dist();""" +class Command(BaseCommand): + help = 'Create views' + + def handle(self, *args, **kwargs): + try: + log_to_telegram('Creating views') + run_sql_command(CMD_PIVOT_DIST) + log_to_telegram('pivot_dist created') + run_sql_command(CMD_PIVOT_DIST_PRE) + log_to_telegram('prepivot_dist created') + except Exception as e: + log_to_telegram('Error creating views: ' + str(e)) diff --git a/service/management/commands/delete_views.py b/service/management/commands/delete_views.py new file mode 100644 index 0000000..3182b8f --- /dev/null +++ b/service/management/commands/delete_views.py @@ -0,0 +1,18 @@ +from django.core.management.base import BaseCommand +from service.utils import run_sql_command, log_to_telegram + +CMD_PIVOT_DIST = """drop view points_with_dist;""" + +CMD_PIVOT_DIST_PRE = """drop view prepoints_with_dist;""" +class Command(BaseCommand): + help = 'delete views' + + def handle(self, *args, **kwargs): + try: + log_to_telegram('Deleting views') + run_sql_command(CMD_PIVOT_DIST) + log_to_telegram('pivot_dist deleted') + run_sql_command(CMD_PIVOT_DIST_PRE) + log_to_telegram('prepivot_dist deleted') + except Exception as e: + log_to_telegram('Error deleting views: ' + str(e)) diff --git a/service/utils.py b/service/utils.py index 9f6c887..197ac46 100644 --- a/service/utils.py +++ b/service/utils.py @@ -17,6 +17,20 @@ from rest_framework.viewsets import ReadOnlyModelViewSet import psycopg2 from postamates.settings import DB_URL +def run_sql_command(command): + connection = psycopg2.connect( + DB_URL + ) + try: + cursor = connection.cursor() + cursor.execute(command) + connection.commit() + except psycopg2.Error as e: + print("Error executing command:", e) + finally: + cursor.close() + connection.close() + def run_psql_command(): connection = psycopg2.connect(