django - Django:将字典插入 my_model.objects.raw() 方法时出错
问题描述
我正在views.py中的函数中执行查询,如下所示:
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() 的 translations 参数将查询中的字段映射到模型字段
喜欢 :
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
- where 参数
如果需要执行参数化查询,可以使用 raw() 的 params 参数
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)
推荐阅读
- excel - 如何参数化 ActiveWorkbook.Query.Add
- python - 将 class_weight 添加到 .fit_generator() 会中断 to_categorical()
- java - QuarkusTest:注入正确的实例
- docker - 尝试部署智能合约时无法在 VSC 环境中启动本地结构
- docker - Dockerfile 的生产“正确方法”是什么?
- sql - PostgreSQL 触发错误:'关系“inventory_product”的列“t”不存在'
- c# - 为 Xamarin Android 控件创建自定义对象包装器
- c# - 如何修复远程服务器返回错误:(403)禁止。每日运动 api
- java - 用于 iPhone 和 Android 的 GluonHQ 上的 USB 通信?
- google-cloud-platform - Cloud Function 中的 GCP rsync 失败