问题描述
input_dict = {'id': 'id','table': 'my_table','first_col': 'my_first_col','first_name': 'my_first_name'}
query = '''
SELECT %(id)s
FROM %(table)s
WHERE %(first_col)s = %(first_name)s '''
qs = my_model.objects.raw(query,input_dict)
print(qs)
打印:
qs: <RawQuerySet:
SELECT id
FROM my_table
WHERE my_first_col = my_first_name >
但是,当我尝试运行此行时:
ids = [item.id for item in qs]
psycopg2.errors.SyntaxError: Syntax error at or near "'my_table'"
LINE 3: FROM 'my_table'
还有:
django.db.utils.ProgrammingError: Syntax error at or near "'my_table'"
LINE 3: FROM 'my_table'
我该怎么办?
解决方法
django无法执行您的查询。
我相信您尝试通过原始函数实现的目标是不可能的。
阅读文档https://docs.djangoproject.com/en/3.0/topics/db/sql/,以更好地了解该功能的工作原理
您的动态选项将同时应用于表字段和where参数:
- 选择字段
您可以使用翻译将查询中的字段映射到模型字段 raw()的参数
like:
name_map = {'first': 'first_name','last': 'last_name','bd': 'birth_date','pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table',translations=name_map)
- 参数在哪里
如果需要执行参数化查询,则可以使用参数 raw()的参数
lname = 'Doe'
Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s',[lname])
最终还是可以的,尽管除非您确切地知道自己在做什么,否则不建议这样做,因为它可能会使系统遭受sql攻击
query = '''
SELECT %(id)s
FROM %(table)s
WHERE %(first_col)s = %(first_name)s '''
query = query%input_dict
qs = my_model.objects.raw(query)