Динамический необработанный запрос (select clause) Django
Я пытаюсь выполнить необработанный запрос в Django, в котором я динамически хочу выбрать имена столбцов. Например
def func(all=True){
if all:
query_parameters = {
'col': '*'
}
else:
query_parameters = {
'col': 'a,b,c'
}
with connections["redshift"].cursor() as cursor:
cursor.execute(
"select %(col)s from table limit 2 ;",
query_parameters,
)
val = dictfetchall(cursor)
return val
}
Django выполняет его как.
select "*" from table limit 2;
так что вывод выглядит как select "*"
*
а в случае else выполняется как
select "a,b,c" from table limit 2;
поэтому на выходе получается a,b,c
Как я могу запустить команду так, чтобы Django выполнил ее как
select a , b , c from table limit 2
так, чтобы на выходе было
a b c
1 2 3
4 5 6
Попробуйте это:
def func(all=True):
if all:
columns = '*'
else:
columns = 'a, b, c'
with connections['redshift'].cursor() as cursor:
cursor.execute(f'select {columns} from table limit 2;')
val = dictfetchall(cursor)
return val
Я сам нашел хак. Смотрите здесь
Пояснение
Подготовленный запрос шаг за шагом
Входные данные (нужные мне столбцы)
self.export_col = "a,b,c"
def calc_col(self):
if self.exp == 'T':
select_col = ""
self.export_col = self.export_col.split(',')
for col in self.export_col:
select_col += col + ","
select_col = select_col[:-1]
self.export_col = select_col
else:
self.export_col += '*'
def prepare_query(self):
query += " SELECT "
query += self.export_col
query += """ from table limit 2;"""