django 执行原始SQL

二、知识点总结

When the model query APIs don’t go far enough, you can fall back to writing raw SQL.

go far enough:远远不够fall back to:求助 
raw:原始的,未加工的

Django提供两种方式执行(performing)原始的SQL查询:

(1) 、 Manager.raw():执行原始查询并返回模型实例

(2) 、 Executing custom SQL directly :直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。

三、raw()方法

The raw() manager method can be used to perform raw SQL queries that return model instances: 
Manager. raw ( raw_query , params=None , translations=None )

用法:

 

>>> for p in Person.objects.raw(‘SELECT * FROM Person LIMIT 2‘):
...     print p
John Smith
Jane Jones

注意,原始SQL里的model,如果在 db_table 没有定义,则使用app的名称,后面下划线 后面接模型类的名称,如"Myblog_New";上面的例子,在定义类的时候已经这样处理了:

Class New(models.Model):
    ......
    ......
#自定义表名
    class Meta:
        db_table = ‘New‘

 2、查询字段隐射到模型字段(Mapping query fields to model fields)

raw() automatically maps fields in the query to fields on the model.并且是通过名称来匹配,这意味着我们可以使用SQL子句(clause)

>>> Person.objects.raw(‘‘‘SELECT first AS first_name,
...                              last AS last_name,
...                              bd AS birth_date,
...                              pk as id,
...                       FROM some_other_table‘‘‘)

返回一个RawQuerySet对象

3、索引查找(Index lookups)

first_person = Person.objects.raw(‘SELECT * from myapp_person‘)[0]
first_person = Person.objects.raw(‘SELECT * from myapp_person LIMIT 1‘)[0]
#然而,索引和切片不是在数据库级别上执行(除LIMIT外)

4、延迟模型字段(Deferring model fields)

Fields may also be left out(left out:忽视,不考虑;被遗忘),这意味着该字段的查询将会被排除在根据需要时的加载。

>>> for p in Person.objects.raw(‘SELECT id, first_name FROM myapp_person‘):
...     print p.first_name, # 这将检索到原始查询
...     print p.last_name # 这将检索需求
...
John Smith
Jane Jones

这个例子其实检索了三个字段,一个主键(必需)、一个原始SQL字段、一个需求字段。这里主键字段不能省略,否则会出错,如下: 

5、传递参数(Passing parameters into raw() )

如果需要执行参数化查询,您可以使用params参数原始()

注意两点: (1)、

(2)、必须使用[参数],否则出错: 
                (3)、这种方式不对:

Error:
>>> query = ‘SELECT * FROM myapp_person WHERE last_name = %s‘ % lname
>>> Person.objects.raw(query)

四、直接执行自定义SQL

Manager.raw() 远远不够,可直接执行自定义SQL,directly execute UPDATE INSERT , or DELETE queries.

django.db.connection:代表默认的数据库连接 
django.db.transaction :代表默认数据库事务(transaction) 
用database connection调用 connection.cursor() 得到一个游标(cursor)对象。 
然后调用 cursor.execute(sql, [params]) 执行SQL 
cursor.fetchone() 或者 cursor.fetchall(): 返回结果行

如果执行修改操作,则调用 transaction.commit_unless_managed()来保证你的更改提交到数据库。

def my_custom_sql():
    from django.db import connection, transaction
    cursor = connection.cursor()

    # 数据修改操作——提交要求
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
    transaction.commit_unless_managed()

    # 数据检索操作,不需要提交
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row

  django.db.connections :针对使用多个数据库

from django.db import connections
cursor = connections[‘my_db_alias‘].cursor()
# Your code here...
transaction.commit_unless_managed(using=‘my_db_alias‘)

 通常我们不需要手动调用 transaction.commit_unless_managed( ),我们可以这样做:

@commit_on_success
def my_custom_sql_view(request, value):
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data modifying operation
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value])

    # Since we modified data, mark the transaction as dirty
    transaction.set_dirty()

    # Data retrieval operation. This doesn‘t dirty the transaction,
    # so no call to set_dirty() is required.
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value])
    row = cursor.fetchone()

    return render_to_response(‘template.html‘, {‘row‘: row})
时间: 2024-10-25 23:13:58

django 执行原始SQL的相关文章

在django中,执行原始sql语句

extra()方法 结果集修改器,一种提供额外查询参数的机制 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where=['price>50']) Book.objects.filter(publisher__name='广东人员出版社',price__gt=50) 2:Book.objects.extra(select={'count':'select count(*) from hello_Book'}) ra

django执行源生sql

执行源生sql在python中我们可以借助pymysql模块来进行执行源生sql关于pymysql执行源生sql可以看我的另外一篇博文:pymysql应用 本篇博客只介绍django中执行的源生sql 1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 使用方式: 用在where后: Book.objects.filter(publisher_id="1").extra(where=["title='python学习1'"

Hibernate 执行原始SQL语句

/** * 根据id删除普通用户 */ public void deleteById(int id) { System.out.println("deleteById"); //获得session Session session = hibernateTemplate.getSessionFactory().openSession(); String str = "delete from ptuser where id="+id; System.out.printl

11.Django数据库操作(执行原生SQL)

1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1").extra(where=["title='python学习1'"]) 用在select后 Book.objects.filter(publisher_id="1").extra(select={"count":"select

【Django】执行原生SQL的三种方法 򚛞

原文: http://blog.gqylpy.com/gqy/383 "> 如下三种方式 extra:结果集修改器,一种提供额外查询参数的机制 raw:执行原始SQL返回模型实例 connection/connections:直接执行自定义SQL(此方法不依赖model) 1.extra示例: # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables=None, ord

[Django] 查看orm自动执行的原始sql

django的文档看了很多,也用了不少,有的时候感觉性能很不好,知道很多地方是惰性查询,但是对于复杂的逻辑,只是表面上发现运行很慢,机器资源消耗很多,却不知道orm到底是什么来转化成sql和查询的. 之前django1.3版本在google上找到了写方法,通过配置settings就能看到每次查询的原始sql,现在用1.6的版本也懒得去找了,反正在自己机子上看法,只是些简单的监视直接改下源码就好了. 于是翻了下django的源码,主要的sql执行语句在 D:\devsofts\python2.7\

Python Django 之 直接执行自定义SQL语句(一)

一.执行自定义SQL方法 1.Executing custom SQL directly 直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句. 2.Manager.raw() 执行原始查询并返回模型实例 二.Executing custom SQL directly Manager.raw() 远远不够,可直接执行自定义SQL,directly execute UPDATE , INSERT , or DELETE queries.django.db.connect

EntityFramework Core 2.0执行原始查询如何防止SQL注入?

前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramework Core执行原始查询 在EntityFramework Core中执行原始查询我们借助FromSql来实现,如下: using (var context = new EFCoreDbContext()) { var orders = context.Orders .FromSql("SELECT

执行Django原生的sql语句

Django中能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题, 如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了 from  django.db  import connection with connection.cursor() as cursor cursor.excute('select * from accounts_User') row = cursor.fetchall() return row 原文