Необработанный SQL-оператор Django с поиском параметров и лайков

#python #django #parameters #rawsql

#python #django #параметры #rawsql

Вопрос:

У меня проблема при выполнении необработанного sql в Django.

 res = []
start = '2017-12-08T01:56:56.701Z'
end = '2020-12-08T01:56:56.701Z'
with connection.cursor() as cursor:
    raw_sql = '''
    select
    case
        when content like '%products%' then 'Products'
    else 'Others'
    end as name,
    count(id) as times
    from mytable
    where somefield LIKE "%somefieldcontent%"
    and created between '%s' and '%s'
    '''
    cursor.execute(raw_sql, [start, end])
    res = cursor.fetchall()
 

Возникает следующая ошибка: символ неподдерживаемого формата «‘ (0x27)

Я попытался выполнить этот sql непосредственно в mysql, он работает. Но это не работает в среде Django. Я думаю, что, должно быть, что-то не так, что я делаю со строкой.

По сути, я хочу использовать параметры вместо concat для построения инструкции SQL. Есть идеи? Спасибо!

Комментарии:

1. это в вашем представлении django?

2. просто функция, используемая где-то.

Ответ №1:

Вы можете попробовать использовать f-string, что-то вроде этого

 
from django.db import connection
start = '2017-12-08T01:56:56.701Z'
end = '2020-12-08T01:56:56.701Z'
def query_example(start, end):
   cursor = connection.cursor()
   
   cursor.execute(
     f'''
     select
      case
        when content like '%products%' then 'Products'
      else 'Others'
      end as name,
      count(id) as times
      from mytable
      where somefield LIKE "%somefieldcontent%"
      and created between {start} and {end}
     '''
   )

   return cursor.fetchall()
 

И затем вы можете получить доступ к данным в представлениях, вызвать query_example func

 def request_data(request):

  data = query_example(...)
  # do something...
  ...
  
  return JsonResponse(data, safe=False)
      or 
  return render(request, "your_template.html", {"data": data})