使用原生sql的主要目的是解决一些很复杂的sql不能用ORM的方法写出的问题。
Django中几种写原生sql的方式
1.extra:结果集修改器,是吗一种提供额外查询参数的机制
- >>>> Book.objects.filter(publisher__name = '清华大学出版社').extra(where = ['price > 10']) #查找清华大学
- 出版社中所有大于10元的书籍。
- >>> Book.objects.filter(publisher__name = '清华大学出版社', price__gt = 10) # 意思和上一种相同
- 还有其他的几种方式,不过这个不太常用,所以不多说了。
2.raw:执行原始sql并返回模型实例
- # 查看数据表 blog_book 中的所有的对象。
- >>> b = Book.objects.raw('select * from blog_book') # raw方法返回的是RawQuerySet的对象,可迭代
- >>> for i in b:
- print(i.title)</span>
- raw方法貌似只能用在查询的时候
3.直接执行自定义SQL(这种方法完全不依赖与model,前面两种方式还是要依赖于model)
其实就是用python操作数据库的方法。
如果SQL学的不错的话,强烈建立使用第三种方式来进行
- from django.db import connection
- # 获得一个游标cursor对象
- cursor = connection.cursor()
- # 插入操作
- cursor.execute("insert into blog_author(name) values('韩寒')")
- # 更新操作
- cursor.execute("update blog_author set name = '郭敬明' where name = '韩寒' ")
- # 删除操作
- cursor.execute("delete from blog_author where name = '郭敬明'")
- # 查询操作
- cursor.execute('select * from blog_author')
- # 一条一条的取数据
- raw = cursor.fetchone()
- # 取出所有数据,以元组的形式返
- cursor.fetchall()
注意:在Django中,如果可以用orm解决的话,首选还是orm,不能解决的时候,再考虑使用原生SQL的方式。因为原生SQL就是为了弥补orm不能够很好的执行较为复杂的SQL命令。