在django sql查询中转义%会导致列表超出范围

8ulbf1ek  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(225)

我试着在pgadmin中运行以下SQL查询,它工作了:

SELECT <columns>
 FROM <tables>
 WHERE 
     date_visited >= '2023-05-26 07:05:00'::timestamp 
     AND date_visited <= '2023-05-26 07:07:00'::timestamp
     AND url LIKE '%/mymodule/api/myurl/%';

我想在django rest endpoint中调用相同的url。所以,我写了如下代码:

with connection.cursor() as cursor:
    cursor.execute('''
        SELECT <columns>
        FROM <tables>
        WHERE 
            date_visited >= '%s'::timestamp 
            AND date_visited <=  '%s'::timestamp
            AND url LIKE '%%%s%%';
        ''', [from_date, to_date, url])

但是它给我的列表索引超出范围错误。我想我在'%%%s%%'上犯了一个错误。我尝试在原始查询中使用%%扩展%。但似乎不起作用。这里出了什么问题?

643ylb08

643ylb081#

您可以使用以下命令**.filter(…)**[Django-doc]:

MyModel.objects.filter(
    date_visited__between=('2023-05-26 07:05:00', '2023-05-26 07:07:00'),
    url__contains='/mymodule/api/myurl/',
)

这里我们可以使用**__contains**查找[Django-doc]来进行 * 区分大小写 * 的匹配。

uelo1irk

uelo1irk2#

预处理语句自动添加引号以防止SQL注入
所以你的代码看起来像

with connection.cursor() as cursor:
    cursor.execute('''
        SELECT <columns>
        FROM <tables>
        WHERE 
            date_visited >= %s::timestamp 
            AND date_visited <=  %s::timestamp
        AND url LIKE %s;
    ''', [from_date, to_date,"%" + url + "%"])

相关问题