django执行原生SQL查询的实现

目录
  • 执行原生 SQL 查询
  • 1、执行原生查询
    • 1.1 普通查询
    • 1.2 将查询字段映射为模型字段
    • 1.3 索引查询
    • 1.4 将参数传给 raw()
  • 2、直接执行自定义 SQL
    • 2.1 指定连接数据库

执行原生 SQL 查询

Django 允许你用两种方式执行原生 SQL 查询:

  • 你可以使用 Manager.raw() 来 执行原生查询并返回模型实例。
  • 或者完全不用模型层 直接执行自定义 SQL。

1、执行原生查询

管理器方法 raw() 能用于执行原生 SQL 查询,就会返回模型实例:

Manager.raw(raw_query, params=None, translations=None)

该方法接受一个原生 SQL 查询语句,执行它,并返回一个 django.db.models.query.RawQuerySet 实例。这个 RawQuerySet 能像普通的 QuerySet 一样被迭代获取对象实例。

1.1 普通查询

class Person(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    birth_date = models.DateField(...)

然后你可以像这样执行自定义 SQL:

for p in Person.objects.raw('SELECT * FROM app_person'): # django默认的表名是app名加类名
    print(p)
​# 没有查询到就报错

1.2 将查询字段映射为模型字段

raw() 字段将查询语句中的字段映射至模型中的字段。
查询语句中的字段排序并不重要。换而言之,以下两种查询是一致的:

Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM app_person')

Person.objects.raw('SELECT last_name, birth_date, first_name, id FROM app_person')

匹配是根据名字来的。这意味着你可以使用 SQL 的 AS 子句将查询语句中的字段映射至模型中的字段。所以,若你还有一些数据表包含了 Person 数据,你可以很方便的将其映射至 Person 实例:

>>> Person.objects.raw('''SELECT first AS first_name,
...                              last AS last_name,
...                              bd AS birth_date,
...                              pk AS id,
...                       FROM app_person''')

只要名字对上了,模型实例就会被正确创建。

或者,你可以用 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)

1.3 索引查询

raw() 支持索引,所以,若你只需要第一个结果就这样写:

>>> first_person = Person.objects.raw('SELECT * FROM app_person')[0]

1.4 将参数传给 raw()

如果你需要执行参数化的查询,可以使用 raw() 的 params 参数:

>>> lname = 'Doe'
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])

params 是一个参数字典。你将用一个列表替换查询字符串中 %s 占位符,或用字典替换 %(key)s 占位符(其中, key 理所应当由字典 key 替换),不论你使用哪个数据库引擎。这些占位符会被 params 参数的值替换。
!!!必须以列表形式传入参数,格式一定是这样写,不能写成字符串

2、直接执行自定义 SQL

绕过模型层。

对象 django.db.connection 代表默认数据库连接。要使用这个数据库连接,调用 connection.cursor() 来获取一个指针对象。然后,调用 cursor.execute(sql, [params]) 来执行该 SQL 和 cursor.fetchone(),或 cursor.fetchall() 获取结果数据。

from django.db import connection
​
def my_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()
​
    return row

要避免 SQL 注入,你绝对不能在 SQL 字符串中用引号包裹 %s 占位符。
注意,若要在查询中包含文本的百分号,你需要在传入参数使用两个百分号:

cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' AND id = %s", [self.id])

2.1 指定连接数据库

用 django.db.connections 获取指定数据库的连接(和指针)。 django.db.connections 是一个类字典对象,它允许你通过连接别名获取指定连接:

from django.db import connections
with connections['my_db_alias'].cursor() as cursor:

到此这篇关于django执行原生SQL查询的实现的文章就介绍到这了,更多相关django执行原生SQL查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Django的模型中执行原始SQL查询的方法

    有时候你会发现Django数据库API带给你的也只有这么多,那你可以为你的数据库写一些自定义SQL查询. 你可以通过导入django.db.connection对像来轻松实现,它代表当前数据库连接. 要使用它,需要通过connection.cursor()得到一个游标对像. 然后,使用cursor.execute(sql, [params])来执行SQL语句,使用cursor.fetchone()或者cursor.fetchall()来返回记录集. 例如: >>> from django

  • django执行原始查询sql,并返回Dict字典例子

    很多时候执行sql语句,数据比django的model来的快,但并不想关心返回的字段,例如你可以执行:select * from product这种sql,这里个方法将会返回与数据库列名相同的键值对 ,格式是这样子的: result = [{"id":1,"name":"product1"},{"id":2,"name":"product2"}] 当然你还可以 import json j

  • django执行原生SQL查询的实现

    目录 执行原生 SQL 查询 1.执行原生查询 1.1 普通查询 1.2 将查询字段映射为模型字段 1.3 索引查询 1.4 将参数传给 raw() 2.直接执行自定义 SQL 2.1 指定连接数据库 执行原生 SQL 查询 Django 允许你用两种方式执行原生 SQL 查询: 你可以使用 Manager.raw() 来 执行原生查询并返回模型实例. 或者完全不用模型层 直接执行自定义 SQL. 1.执行原生查询 管理器方法 raw() 能用于执行原生 SQL 查询,就会返回模型实例: Man

  • 手把手教你用Django执行原生SQL的方法

    前言 Hey,各位小伙伴,这次怎么来玩一下,如何使用Django执行原生SQL. 我们都知道,Python在web界的扛把子--Django,可谓是集大成为统一,各种各样的插件.forms组件.model模型.Admin后台等等,后面我会专门出文章娓娓道来,反正就是一个字,NB. 本次就来学一下,如何在Django执行原生语句. 起因 在使用Django时,一般情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题 但是,但是,那20%就不要了吗???肯定不行哎,小

  • thinkPHP框架中执行原生SQL语句的方法

    本文实例讲述了thinkPHP框架中执行原生SQL语句的方法.分享给大家供大家参考,具体如下: 怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $Model = D(); 或者 $Model = M(); $sql = "select * from `order`"; $voList = $Model->query($sql); 只是需要new一个空的模型继承Model中的方法. 注意query是查功能,execute是增删改

  • Laravel框架执行原生SQL语句及使用paginate分页的方法

    本文实例讲述了Laravel框架执行原生SQL语句及使用paginate分页的方法.分享给大家供大家参考,具体如下: 1.运行原生sql public function getList($data){ //获取前端传过来的参数 $user = $data['userId']; $office = $data['officeId']; $key = $data['oneKeySearch']; //进行模糊搜索和联合查询 $where = 'and 1=1 '; if($key!=null) {

  • ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例

    本文实例讲述了ThinkPHP3.2.3框架实现执行原生SQL语句的方法.分享给大家供大家参考,具体如下: [查询语句]query方法 示例:查询blog_article表中的文章标题title字段 //构造sql语句 $sql = "select `title` from blog_article"; //或者下面两种,都会自动读取当前设置的表前缀 //$sql = "select `title` from __PREFIX__article"; //$sql =

  • 查看django执行的sql语句及消耗时间的两种方法

    下面介绍两种查看django 执行的sql语句的方法. 方法一: queryset = Apple.objects.all() print queryset.query SELECT `id`, `name` FROM `apple` 该方法只能查看select语句,但不能查看其他更新保存的语句,会报错. 也就是说只有 Queryset 有query方法.接下来看第二种方法. 方法二: from django.db import connection print connection.queri

  • SpringDataJPA原生sql查询方式的封装操作

    工具类相关代码 使用到了apache的map2bean工具类 导入方法 <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> import org.apache.commons.beanutils.Bea

  • 基于SQLAlchemy实现操作MySQL并执行原生sql语句

    场景应用 老大我让爬取内部网站获取数据,插入到新建的表中,并每天进行爬取更新数据(后面做了定时任务).然后根据该表统计每日的新增数量/更新数量进行制图制表,向上级汇报. 思路构建 选用sqlalchemy+mysqlconnector,连接数据库,创建表,对指定表进行CRUD from sqlalchemy import exists, Column, Integer, String, ForeignKey, DateTime, Text, func from sqlalchemy.ext.de

  • PHP tp5中使用原生sql查询代码实例

    注意事项: 1.先在database.php中配置好数据库 2.只要是数据库操作必须引用 use/think/Db;严格区分大小写. 下面是方法: public function hello5() { //所有查询必须 use/think/Db; /* 1 配置数据库 * 2 使用DB 命名空间 * */ /****************tp5中使用原生语句*******************/ //query 用于查询 其他的用execute // 插入记录 // $result = Db

随机推荐