是否可以在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。
感谢。
答案 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 注入漏洞仍然是完全安全的