-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconvert_dbt_model_to_sql.py
92 lines (69 loc) · 2.26 KB
/
convert_dbt_model_to_sql.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
83
84
85
86
87
88
89
90
91
92
import sys
import json
if '--models' not in sys.argv:
raise ValueError('Missing `--models` parameter')
PROJECT_NAME = ""
RAW_SCHEMA_NAME = ""
RAW_SCHEMA_VARIABLE_NAME = ""
TARGET_SCHEMA = ""
ROOT = sys.path[0]
MANIFEST_FILE_NAME = 'manifest.json'
MANIFEST_FILE_PATH = ROOT + "/compiled/" + MANIFEST_FILE_NAME
MODEL_ROOT = '{}.{}'.format(TARGET_SCHEMA, PROJECT_NAME)
class colors:
PASS = '\033[92m'
FAIL = '\033[91m'
ENDC = '\033[0m'
with open(MANIFEST_FILE_PATH) as fp:
manifest = json.load(fp)
macros = manifest['macros']
models = manifest['nodes']
model_param_index = sys.argv.index('--models')
model_list = sys.argv[model_param_index + 1:]
def run():
for model_name in model_list:
try:
model_lookup = MODEL_ROOT + '.%s' % model_name
model = models[model_lookup]
dbt_sql = model['raw_sql']
to_sql(model_name, dbt_sql)
except KeyError:
if model_lookup not in models.keys():
_printer(model_name, is_error=True)
def to_sql(model_name, dbt_sql):
query_start = False
l = []
for line in dbt_sql.splitlines():
if 'select' not in line and 'with' not in line:
pass
else:
query_start = True
if query_start:
l.append(_line_to_sql(line) + '\n')
_printer(model_name, is_error=False, sql=l)
def _line_to_sql(line):
if '{{' in line and 'ref' in line:
return _convert_ref(line)
elif '{{' in line and 'var' in line:
return _convert_var(line)
else:
return line
def _convert_var(line):
line = line.replace( ( "{{ var('%s') }}" % RAW_SCHEMA_VARIABLE_NAME ) , RAW_SCHEMA_NAME )
return line
def _convert_ref(line):
line = line.replace("{{ ref('", ("%s." % TARGET_SCHEMA ) ).replace("') }}", '')
return line
def _printer(model_name, is_error, sql=None):
if is_error:
color = colors.FAIL
print('%s\n*****************\n' % color)
print("'%s' does not identify any models" % model_name)
print('\n*****************\n' + colors.ENDC)
else:
color = colors.PASS
print('%s\n*****************\n' % color)
print(model_name)
print('\n*****************\n' + colors.ENDC)
print(''.join(sql))
run()