执行原生 SQL 查询 Django 允许你用两种方式执行原生 SQL 查询: 你可以使用 Manager.raw() 来 执行原生查询并返回模型实例。 或者完全不用模型层 直接执行自定义 SQL。 1、执行原生查询 管理器方法 raw() 能用于执行原生 SQL 查询,就会返回模型实例: Mana
执行原生 SQL 查询
Django 允许你用两种方式执行原生 SQL 查询: 管理器方法 raw() 能用于执行原生 SQL 查询,就会返回模型实例:
该方法接受一个原生 SQL 查询语句,执行它,并返回一个 django.db.models.query.RawQuerySet 实例。这个 RawQuerySet 能像普通的 QuerySet 一样被迭代获取对象实例。
然后你可以像这样执行自定义 SQL:
1.2 将查询字段映射为模型字段
raw() 字段将查询语句中的字段映射至模型中的字段。
匹配是根据名字来的。这意味着你可以使用 SQL 的 AS 子句将查询语句中的字段映射至模型中的字段。所以,若你还有一些数据表包含了 Person 数据,你可以很方便的将其映射至 Person 实例:
只要名字对上了,模型实例就会被正确创建。 或者,你可以用 raw() 的 translations 参数将查询语句中的字段映射至模型中的字段。这是一个字典,将查询语句中的字段名映射至模型中的字段名。例如,上面的查询也能这样写:
1.3 索引查询 raw() 支持索引,所以,若你只需要第一个结果就这样写:
1.4 将参数传给 raw() 如果你需要执行参数化的查询,可以使用 raw() 的 params 参数:
params 是一个参数字典。你将用一个列表替换查询字符串中 %s 占位符,或用字典替换 %(key)s 占位符(其中, key 理所应当由字典 key 替换),不论你使用哪个数据库引擎。这些占位符会被 params 参数的值替换。 绕过模型层。 对象 django.db.connection 代表默认数据库连接。要使用这个数据库连接,调用 connection.cursor() 来获取一个指针对象。然后,调用 cursor.execute(sql, [params]) 来执行该 SQL 和 cursor.fetchone(),或 cursor.fetchall() 获取结果数据。
要避免 SQL 注入,你绝对不能在 SQL 字符串中用引号包裹 %s 占位符。
2.1 指定连接数据库 用 django.db.connections 获取指定数据库的连接(和指针)。 django.db.connections 是一个类字典对象,它允许你通过连接别名获取指定连接:
|
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27