Django:具有动态数量变量的原始SQL查询

时间:2011-11-30 01:38:56

标签: mysql django

是否可以在Django中构造原始SQL查询,以便它们接受动态数量的参数?例如,假设我的应用程序中有以下url结构:

/books/category/history/
/books/category/history/1800s/

对于第一个查询,我正在查找所有包含关键字“历史记录”的图书,而对于第二个查询,我正在寻找所有包含关键字“历史记录”和关键字“1800s”的图书。

我目前对每个查询都有两个单独的查询:

keyword1 = 'history'
SELECT appname_book.name AS name FROM appname_book WHERE keyword=%s,[keyword1]

keyword1 = 'history'
keyword2 = '1800s'
SELECT appname_book.name AS name FROM appname_book WHERE keyword=%s AND keyword=%s,[keyword1, keyword2]

任何人都知道更清洁,更有效的方法吗?

我正在使用Django 1.3和MySQL。

感谢。

2 个答案:

答案 0 :(得分:2)

为什么不使用Django QuerySet,如下所示:

Book.objects.all().filter(keyword__in=['history','1800s']).values('name')

使用RAW SQL的另一种可能的解决方案是:

keywords = []
SQL = 'SELECT appname_book.name AS name FROM appname_book WHERE 1=1 '
SQL += ' '.join(['AND keyword=%s' for _ in params])

答案 1 :(得分:0)

当然,您可以执行这样的操作来动态生成 raw SQL query

sql = 'SELECT id FROM table WHERE 1 = 1'
params = []

if 'description' in args.keys():
    sql += ' AND description LIKE %s'
    params.append('%'+args['description']+'%')
if 'is_active' in args.keys():
    sql += ' AND is_active LIKE %s'
    params.append(args['is_active'])

...你可以输入尽可能多的“ifs”来构建查询

with connections['default'].cursor() as cursor:
    cursor.execute(sql, params)

这种方式对于 SQL 注入漏洞仍然是完全安全的