當(dāng)model滿足不了需求的時候(比如:存儲過程拱层、多表連接等),可以使用原生sql径缅。
django提供了兩種方法使用原生的sql:
????1、使用Manager.raw()執(zhí)行原生sql氧卧,它會返回model實例
? ? 2氏堤、直接執(zhí)行原生sql,完全忽略model闪檬。警告:使用原生sql的時候购笆,要盡可能的使用參數(shù)的形式以防止用戶進行sql注入攻擊。
#代碼#:
def my_custom_sql():
from django.db import connection, transaction
cursor = connection.cursor()
# Data modifying operation - commit required
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
transaction.commit_unless_managed()
# Data retrieval operation - no commit required
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
#對象django.db.connection代表默認的數(shù)據(jù)庫連接样傍,而django.db.transaction代表默認的數(shù)據(jù)庫事務(wù)铺遂。通過調(diào)用connection.cursor()得到數(shù)據(jù)庫游標(biāo)對象--可以查詢也可以做增刪改操作娃循。然后調(diào)用cursor.execute(sql, [params])執(zhí)行sql語句斗蒋,并且我們可以使用cursor.fetchone()獲取一條記錄,也可以使用cursor.fetchall()獲取所有記錄捞蚂。如果執(zhí)行的sql語句修改了數(shù)據(jù)庫中的內(nèi)容跷究,那么可以調(diào)用transaction.commit_unless_managed()提交所作的修改俊马,獲取數(shù)據(jù)的操作則沒有調(diào)用提交函數(shù)的必要丁存。
fetchone() :
返回單個的元組,也就是一條記錄(row)柴我,如果沒有結(jié)果 則返回 None
fetchall() :
返回多個元組解寝,即返回多個記錄(rows),如果沒有結(jié)果 則返回 ()
需要注明:在MySQL中是NULL,而在Python中則是None
用法如下所示:
fetchone()用法:
cur.execute("select host,user,password from user where user='%s'" %acc)
jilu = cur.fetchone()? ##此時 通過 jilu[0],jilu[1],jilu[2]可以依次訪問host,user,password
fetchall()用法:
cur.execute("select * from user")
如果select本身取的時候有多條數(shù)據(jù)時:
cursor.fetchone():將只取最上面的第一條結(jié)果艘儒,返回單個元組如('id','title')聋伦,然后多次使用cursor.fetchone()夫偶,依次取得下一條結(jié)果,直到為空觉增。
cursor.fetchall() :將返回所有結(jié)果兵拢,返回二維元組,如(('id','title'),('id','title')),
如果select本身取的時候只有一條數(shù)據(jù)時:
cursor.fetchone():將只返回一條結(jié)果逾礁,返回單個元組如('id','title')说铃。
cursor.fetchall() :也將返回所有結(jié)果敞斋,返回二維元組截汪,如(('id','title'),),
備注:其中的id和title為具體的內(nèi)容
python在mysql在使用fetchall或者是fetchone時,綜合起來講植捎,fetchall返回二維元組(元組中含有元組)衙解,fetchone只返回一維元組。