原生数据库操作方法一:
查询:MyModel.objects.raw()
语法:MyModel.objects.raw(SQL语句,拼接参数)
返回值:RawQuerySet集合对象【只支持基础操作,比如循环】
Django官方一般不建议直接使用SQL做查询操作,容易被注入SQL,例如下面这个案例:
#模拟sql注入获取所有用户:
def sqltest(request,user_id):
sql = 'select * from user where id=%s'%(user_id)
f = User.objects.raw(sql)
for i in f:
print(i.name)
sqltest(1 or 1=1)
解决上面的这个漏洞的办法就是不要自己拼接sql语句,而是用传参的方式,例如:
#自己拼接(危险)
Book.objects.raw('selece * from bookstore_book where id=%s'%('1 or 1=1'))
#传参(安全):
让Django帮我们传参,Django会帮我们把危险的字符转义掉
Book.objects.raw('selece * from bookstore_book where id=%s,['1 or 1=1']'
原生数据库操作方法二(cursor):
直接使用游标操作数据库,为了保证出现异常时能够释放游标cursor资源,推荐使用with语句创建操作
#方法:
from django.db import connection
with connection.cursor() as cur:
cur.execute('SQL语句'.'拼接参数')
示例:
from django.db import connection
#更新表bookstore_book里的字段pub为XXX出版社
with connection.cursor() as cur:
cur.execute('update bookstore_book set pub_house="XXX出版社" where id=10;')
#删除id=1的一条记录
with connection.cursor() as cur:
cur.execute('delete from bookstore_book where id=10;')