-
Notifications
You must be signed in to change notification settings - Fork 0
/
BestekUpdater.py
82 lines (68 loc) · 3.35 KB
/
BestekUpdater.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import logging
from typing import Iterator
from Helpers import peek_generator, turn_list_of_lists_into_string
from ResourceEnum import colorama_table, ResourceEnum
class BestekUpdater:
@staticmethod
def update_objects(object_generator: Iterator[dict], connection, safe_insert: bool = False):
object_generator = peek_generator(object_generator)
if object_generator is None:
return
values_array = []
for bestek_dict in object_generator:
try:
record_array = [f"'{bestek_dict['uuid']}'"]
eDeltaDossiernummer = bestek_dict.get('eDeltaDossiernummer', None)
if eDeltaDossiernummer is None and 'nummer' in bestek_dict:
eDeltaDossiernummer = bestek_dict['nummer']
record_array.append(f"'{eDeltaDossiernummer}'")
eDeltaBesteknummer = bestek_dict.get('eDeltaBesteknummer', None)
if eDeltaBesteknummer is None and 'nummer' in bestek_dict:
eDeltaBesteknummer = bestek_dict['nummer']
record_array.append(f"'{eDeltaBesteknummer}'")
aannemerNaam = None
if 'aannemerNaam' in bestek_dict:
aannemerNaam = bestek_dict['aannemerNaam'].replace("'", "''")
if aannemerNaam is not None:
record_array.append(f"'{aannemerNaam}'")
else:
record_array.append("NULL")
values_array.append(record_array)
except KeyError as exc:
logging.error(colorama_table[ResourceEnum.bestekken] + f'Could not create a bestek from the following respoonse:\n{bestek_dict}\nError:{exc}')
raise exc
values_string = turn_list_of_lists_into_string(values_array)
insert_query = f"""
WITH s (uuid, eDeltaDossiernummer, eDeltaBesteknummer, aannemerNaam)
AS (VALUES {values_string}),
t AS (
SELECT uuid::uuid AS uuid, eDeltaDossiernummer, eDeltaBesteknummer, aannemerNaam
FROM s),
to_insert AS (
SELECT t.*
FROM t
LEFT JOIN public.bestekken AS bestekken ON bestekken.uuid = t.uuid
WHERE bestekken.uuid IS NULL)
INSERT INTO public.bestekken (uuid, eDeltaDossiernummer, eDeltaBesteknummer, aannemerNaam)
SELECT to_insert.uuid, to_insert.eDeltaDossiernummer, to_insert.eDeltaBesteknummer, to_insert.aannemerNaam
FROM to_insert;"""
update_query = f"""
WITH s (uuid, eDeltaDossiernummer, eDeltaBesteknummer, aannemerNaam)
AS (VALUES {values_string}),
t AS (
SELECT uuid::uuid AS uuid, eDeltaDossiernummer, eDeltaBesteknummer, aannemerNaam
FROM s),
to_update AS (
SELECT t.*
FROM t
LEFT JOIN public.bestekken AS bestekken ON bestekken.uuid = t.uuid
WHERE bestekken.uuid IS NOT NULL)
UPDATE bestekken
SET eDeltaDossiernummer = to_update.eDeltaDossiernummer, eDeltaBesteknummer = to_update.eDeltaBesteknummer,
aannemerNaam = to_update.aannemerNaam
FROM to_update
WHERE to_update.uuid = bestekken.uuid;"""
cursor = connection.cursor()
cursor.execute(insert_query)
cursor = connection.cursor()
cursor.execute(update_query)