Поместить слово с пробелами в качестве переменной в sql-запрос с помощью .format()

Я хотел бы узнать, как поместить слово с пробелом в качестве переменной в sql запрос (я использую postgresql)

data   = "something with white space"
choice = "DESC"
limit  = 10 

def rDB(sql_request):
    with connection.cursor() as cursor:
        cursor.execute(sql_request)
        row = cursor.fetchall()
    return row

queryWithFormat(data, choice, limit):
    return('''
           SELECT col1, SUM(col2) as nb
           FROM Table
           WHERE col1 = {d}  
           ORDER BY nb {c}
           LIMIT {l}
           '''.format(d=data, c=choice, l=limit)

rDB(queryWithFormat(data, choice, limit))

django.db.utils.ProgrammingError: ERROR: syntax error on or near 'with'
LINE 8: WHERE col1 = something with white ...
-------------------------------^

Лучший способ - вообще не использовать встроенное в Python форматирование строк! Вместо этого следует создать параметризованный запрос.

Я думаю, что можно заставить ваш код работать, заключив переменную в кавычки col1 = '{d}', но я говорю вам это только для информации, и вы не должны этого делать . Это риск для безопасности. Для лучшей практики посмотрите этот раздел документации .

В сторону Django (не моя область знаний...), похоже, что вы используете SQLAlchemy для выполнения запроса. Эта библиотека имеет собственный синтаксис и методы для связывания параметров, которые вы могли бы реализовать следующим образом:

from sqlalchemy.sql import text

def query_with_format(data, choice, limit):
    query = text("""
           SELECT col1, SUM(col2) as nb
             FROM Table
            WHERE col1 = :d 
           ORDER BY nb :c
           LIMIT :l
    """)
    query.bindparams(d=data, c=choice, l=limit)
    return query

rDB(query_with_format(data, choice, limit))

Я не думаю, что при таком подходе у вас возникнут проблемы с переменными, содержащими пробелы, и это намного, намного безопаснее.

Вернуться на верх