轉載自:https://my.oschina.net/liuyuantao/blog/712189
通常來講,最好用 Django 自帶的模型來實現這些操做。這裏僅僅只是爲了學習使用原始 SQL 而作的練習。html
Django 提供了很是方便的數據管理模型 models,能夠完成與數據庫的基本操做。但有時,Django 原始的 models 的功能可能會不太夠用,這些狀況下能夠直接繞過模型直接訪問數據庫。python
Django提供兩種方式執行(performing)原始的SQL查詢:sql
- Manager.raw():執行原始查詢並返回模型實例
- Executing custom SQL directly:直接執行自定義SQL,這種方式能夠徹底避免數據模型,而是直接執行原始的SQL語句。
先上程序,再解釋。數據庫
下面的函數,獲取表單傳遞過來的 POST 數據,而後執行 Insert/Update 操做。django
from django.views.decorators.csrf import csrf_exempt from django.db.transaction import commit_on_success import MySQLdb @csrf_exempt @commit_on_success def add_post(request): from django.db import connection, transaction title = request.POST.get('title', False) vicetitle = request.POST.get('vice_title', False) digest = request.POST.get('digest', False) content = request.POST.get('content', False) db = MySQLdb.connect(user='root', db='testdb', passwd='', host='localhost', charset='utf8') #cursor = db.cursor() cursor = connection.cursor() #cursor.execute("INSERT INTO nowamagic (title, vicetitle, digest, content) values (%s, %s, %s, %s)", [title, vicetitle, digest, content]) cursor.execute("UPDATE chika SET title = '3333' WHERE id = '2'") transaction.commit_unless_managed() #transaction.set_dirty() db.close() return render_to_response('test.html', context_instance=RequestContext(request))
一些語句的大概解釋:less
- django.db.connection,表明了默認的數據庫鏈接,
- django.db.transaction,表明默認的數據庫事務。
- counnection.cursor,表明默認數據庫遊標。
- cursor.execute(sql,[params]),執行sql語句。
- cursor.fetchone()或cursor.fetchall(),返回查詢的結果。
- transaction.commit_unless_managed(),事務提交,確保數據更改(在更改數據庫時使用,若是查詢操做不必使用)
若是你正在使用事務裝飾器(例如 commit_on_success)來修飾視圖和提供事務控制。你沒必要手動調用 transaction.commit_unless_managed(),固然若是你願意的話,能夠手動調用,可是通常狀況下用不着這麼作,這是由於裝飾器會爲你自動提交事務。可是,若是你不手動提交修改,你須要使用 transaction.set_dirty() 將事務標識爲已髒。函數
@commit_on_success def my_custom_sql_view(request, value): from django.db import connection, transaction cursor = connection.cursor() # Data modifying operation cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value]) # Since we modified data, mark the transaction as dirty transaction.set_dirty() # Data retrieval operation. This doesn't dirty the transaction, # so no call to set_dirty() is required. cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value]) row = cursor.fetchone() return render_to_response('template.html', {'row': row})
使用 Django ORM 對數據庫進行修改時,Django 會自動調用 set_dirty() 。但若是你使用了原始 SQL ,Django 就沒法得到你的 SQL 是否修改了數據。只有手動調用 set_dirty() 才能確保 Django 知曉哪些修改必須被提交。post