1. 程式人生 > 其它 >12Django的原生資料庫操作方法

12Django的原生資料庫操作方法

原生資料庫操作方法一:

查詢: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;')