Django执行原始SQL

本文介绍了Django中执行原始SQL查询的两种方法,包括Manager.raw()和直接执行自定义SQL。详细阐述了raw()方法的使用,如字段映射、索引查找、延迟加载和参数传递,并给出了直接执行SQL的示例,涉及数据库事务和多数据库操作。
摘要由CSDN通过智能技术生成

一、参考文档和资料

Django 1.2

https://docs.djangoproject.com/en/1.2/topics/db/sql/

二、知识点总结

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

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

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

三、raw()方法
1、Manager.raw(raw_query, params=None, translations=None)

这种方法通过执行原始的SQL查询并返回一个RawQuerySet实例。返回的RawQuerySet实例就如QuerySet一样能够迭代。

复制代码
>>> from account.models import person #导入person类 >>> raw_sql = 'select * from Person' #原始sql语句 >>> raw_querySet = person.objects.raw(raw_sql) #xx.objects.raw()执行原始sql >>> print raw_querySet 
  
  
   
   '
   
   select * from Person
   
   '> 
   
   #
   
   RawQuerySet对象 >>> 
   
   for obj 
   
   in raw_querySet: 
   
   #
   
   迭代循环 ... 
   
   print
   
    obj
...
张三
李四
王五
  
  
复制代码

 

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

1
2
3
4
5
6
Class New(models.Model):
    ......
    ......
#自定义表名
    class Meta:
        db_table = 'New'

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

raw() 方法自动通过查询字段映射到 model字段,并且是通过名称来匹配,这意味着我们可以使用SQL子句(clause)

注意当输入查询字段的时候,不要漏了主键(id),否则会出错:InvalidQuery: Raw query must include the primary key

(1)、当有其他表(如表1)的时候,如果sql查询中对应名字(xx as yy)与表2中的字段匹配的话(yy)则model实例将会被创建:

1
2
3
4
5
>>> table1.objects.raw('''SELECT first AS first_name,
...                              last AS last_name,
...                              bd AS birth_date,
...                              pk as id,
...                       FROM some_other_table''')

(2)、可以使用raw()方法中的translations参数进行query 字段到model字段的映射。

>>> name_map = {
  'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} >>> table1.objects.raw('SELECT * FROM some_other_table', translations=name_map)

some_other_table 字段(first,last,bd,pk) 通过字典映射table1字段(first_name,last_name,birth_date,id)

3、索引查找(Index lookups)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值