【问题标题】:Raw SQL Query using a list parameter fails使用列表参数的原始 SQL 查询失败
【发布时间】:2018-03-30 13:31:37
【问题描述】:

我有以下代码:

 products = Product.objects.raw(
            'SELECT DISTINCT ON(I.product_id) P.id, P.name, P.desc, C.name AS ram, I.image '
            'FROM products_product AS P '
            'LEFT JOIN categories AS RPC ON P.id = RPC.product_id '
            'LEFT JOIN company AS CP ON P.company_id = CP.id '
            'LEFT JOIN category AS C ON RPC.category_id = C.id '
            'LEFT JOIN image AS I ON I.product_id = P.id '
            'WHERE P.id IN %s', list
    )

我收到以下错误:

not all arguments converted during string formatting

我尝试使用 [2,4] 或 ['2', '4'] 而不是列表,同样的错误。

如果我使用不带参数的工作。我使用 PostgreSQL。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    根据SQL notation 对于IN(),这可能是IN ('2', '4')。 因此,您可以尝试以下方法:

    ~'WHERE P.id IN {0}'.format(tuple(your_list))~

    编辑

    警告

    不要在原始查询中使用字符串格式或引用占位符 你的 SQL 字符串!

    Following Django documentation about it,你可以使用:

    products = Product.objects.raw(
        'SELECT DISTINCT ON(I.product_id) P.id, P.name, P.desc, C.name AS ram, I.image '
        'FROM products_product AS P '
        'LEFT JOIN categories AS RPC ON P.id = RPC.product_id '
        'LEFT JOIN company AS CP ON P.company_id = CP.id '
        'LEFT JOIN category AS C ON RPC.category_id = C.id '
        'LEFT JOIN image AS I ON I.product_id = P.id '
        'WHERE P.id IN %s', params=[your_list])
    

    【讨论】:

    • 不要使用这样的格式。它不会转义参数,因此容易受到 SQL 注入的攻击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多