【问题标题】:Django: making raw SQL query, passing multiple/repeated params?Django:进行原始 SQL 查询,传递多个/重复参数?
【发布时间】:2010-05-31 14:48:11
【问题描述】:

希望这应该是一个相当简单的问题,但我对 Python 和 Django 的了解还不够,无法回答。

我在 Django 中有一个原始 SQL 查询,它采用六个不同的参数,其中前两个(centreLat 和 centerLng)每个都重复:

query = "SELECT units, (SQRT(((lat-%s)*(lat-%s)) + ((lng-%s)*(lng-%s)))) AS distance FROM places WHERE lat<%s AND lat>%s AND lon<%s AND lon>%s ORDER BY distance;"
params = [centreLat,centreLng,swLat,neLat,swLng,neLng]
places = Place.objects.raw(query, params)

如何构造params 对象和query 字符串,以便他们知道要重复哪些参数以及在哪里重复?

【问题讨论】:

    标签: django


    【解决方案1】:

    你有(至少)两个选择。您可以按照它们需要出现的顺序在列表中包含这些重复的参数 - 这意味着您最终会在列表中多次得到相同的值,如下所示:

    params = [centreLat,centreLng,swLat,neLat,swLng,neLng,centreLat,centreLng]
    

    或者,您可以使用字典命名每个参数,而不是仅使用“%s”,您可以像这样使用“%(name)s”:

    query = "SELECT units, (SQRT(((lat-%(lat)s)*(lat-%(lat)s)) + ((lng-%(lng)s)*(lng-%(lng)s)))) AS distance FROM places WHERE lat<%(lat)s AND lat>%(lat)s AND lon<%(lng)s AND lon>%(lng)s ORDER BY distance;"
    params = {'lat':centreLat,'lng':centreLng}
    

    (不要逐字复制该代码,我确定这不是您所需要的)

    【讨论】:

    • 字典的答案对我来说似乎更好。我总是喜欢使用命名参数。这对可读性也更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2012-03-16
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多