django 使用.format()将白色的单词作为变量放入sql查询中

5us2dqdw  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(154)

我想知道如何将白色的单词作为变量放在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}
           GROUP BY col1 
           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 ...
-------------------------------^
ifsvaxew

ifsvaxew1#

最好的方法是根本不使用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
         GROUP BY col1
         ORDER BY nb :c
            LIMIT :l
    """)
    query.bindparams(d=data, c=choice, l=limit)
    return query

rDB(query_with_format(data, choice, limit))

我认为使用这种方法处理包含空格的变量不会有任何问题,而且它要安全得多。

相关问题