orm与mysql
一. orm执行原生sql语句
在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询。
Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。
1. 执行原生sql查询
raw()管理器方法用于原始的SQL查询,并返回模型的实例:
注意:raw()语法查询必须包含主键。
这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet 实例。 这个RawQuerySet 实例可以像一般的QuerySet那样,通过迭代来提供对象实例
raw()管理器方法用于原始的SQL查询,并返回模型的实例 ret = models.Book.objects.raw('select * from app01_book') print(ret) # <RawQuerySet: select * from app01_book> for i in ret: print(i.id, i.title, i.commentNum) 原生SQL还可以使用参数,注意不要自己使用字符串格式化拼接SQL语句,防止SQL注入 d = {'commentNum': 'cn'} ret = models.Book.objects.raw('select * from app01_book where id > %s', translations=d, params=[2,]) for i in ret: print(i.id, i.title, i.cn)
2. 直接执行自定义sql
有时候raw()方法并不十分好用,很多情况下我们不需要将查询结果映射成模型,或者我们需要执行DELETE、 INSERT以及UPDATE操作。在这些情况下,我们可以直接访问数据库,完全避开模型层。
我们可以直接从django提供的接口中获取数据库连接,然后像使用pymysql模块一样操作数据库
from django.db import connection, connections cursor = connection.cursor() sql = 'select * from app01_book' cursor.execute(sql) ret = cursor.fetchone() print(ret)
二. Python脚本中调用Django环境(django外部脚本使用models)
if __name__ == '__main__': import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'manytable.settings') import django django.setup() from app01 import models books = models.Book.objects.all() print(books)