在前面(【實戰演練】數據庫基本知識與原理系列https://blog.51cto.com/14423403/2418820)的文章,已經分享過數據庫的原理,設計與開發的范式,以及根據我們django項目的需求,進行了數據庫的設計。另外也介紹過數據庫操作的基本SQL命令。


以前不使用web框架來進行開發,那么就需要在一個php或者py文件(頁面文件里面),從展示層(html、css、js)到邏輯層(php、python)到數據層(SQL)的東西都要寫。直接用pymysql用什么pymysql.connect()連接數據庫,然后用pymysql.fetchall()在里面寫具體sql語句來操作數據庫。


1、django數據庫OCM

而這樣的最大問題是展示層、邏輯層、數據層沒有分離,每個開發人員都要從前端到后端全部懂,并且代碼很難復用,所以引用了MVC模型的開發框架將3者分開。

此外,django里面有一套叫OCM的操作命令,來封裝了SQL語句,不用具體寫SQL命令,這樣有什么好處呢?

不同版本數據庫SQL有微小差異:mysql、oracle、sql server總體上sql的增刪改查命令都是一樣的,但是細節上還是有一些小差異的。所以如果需要將系統從mysql數據庫遷移到oracle數據庫,那么很可能需要對代碼進行重寫,否則會出BUG。

而django直接使用OCM命令封裝SQL,其實OCM就已經自動匹配與翻譯SQL命令,在settings.py文件里面,就可以指定django項目使用什么數據庫,然后執行

            python?manage.py?makemigrations
python?manage.py?migrate
          

系統就會自動生產對應配置了的數據庫(例如oracle)的SQL命令,并且對數據庫進行操作。


2、編輯models

只需要編輯app里面的models.py文件,就可以創建數據庫表了。

            
              
                # -*- coding: utf-8 -*-
                
from __future__ import unicode_literals

from django.db import models

# Create your models here.


class student(models.Model):
? ?sno = models.CharField( max_length = 10 , unique = True , primary_key = True )
? ?sname = models.CharField( max_length = 10 , null = True )
? ?ssex = models.CharField( max_length = 10 , null = True )
? ?susername = models.CharField( max_length = 20 , null = True )
? ?sage = models.CharField( max_length = 10 , null = True )
? ?sdept = models.CharField( max_length = 10 , null = True )

class teacher(models.Model):
? ?tno = models.CharField( max_length = 10 , unique = True , primary_key = True )
? ?tname = models.CharField( max_length = 10 , null = True )
? ?tusername = models.CharField( max_length = 20 , null = True )
? ?ttitle = models.CharField( max_length = 10 , null = True )
? ?
class course(models.Model):
? ?cno = models.CharField(max_length=10, unique=True, primary_key=True)
? ?cname = models.CharField(max_length=10, null=True)
? ?ccredit = models.CharField(max_length=10, null=True)
? ?ctime = models.CharField(max_length=10, null=True)
? ?cplace = models.CharField(max_length=10, null=True)
? ?tno_id = models.ForeignKey(teacher,to_field='tno',on_delete=models.CASCADE)

class score(models.Model):
? ?cno = models.ForeignKey(course, to_field='cno', on_delete=models.CASCADE)
? ?sno = models.ForeignKey(student, to_field='sno', on_delete=models.CASCADE)
? ?cscore = models.IntegerField(null=True)

每個字段可以按照需要自定義類型,具體可以查閱官方文檔,其中CharField是字符串,DateFiled是時間戳,IntergeFiled是整數,foreignkey就是外鍵,CASCADE是級聯刪除,即如果主鍵刪除了,要級聯刪除。部分django版本寫成on_delete='CASCADE'

系統為什么要創建這些表格,怎么定義表格的字段與關聯關系,詳見之前的文章:(【實戰演練】數據庫基本知識與原理系列02-數據庫設計與開發的范式https://blog.51cto.com/14423403/2418820)

然后執行makemigrations,是將models里面的數據庫表創建的需求,轉為對應mysql配置的SQL命令。

            python?manage.py?makemigrations
          

然后對配置好的數據庫進行轉換后的命令操作。

            python?manage.py?migrate
          

執行完畢后,直接用navicat for mysql去數據庫查看,數據庫表已經成功創建了。

【實戰演練】Python+Django網站開發系列06-django數據庫創建與使用_第1張圖片

3、OCM操作數據庫

django使用OCM對數據庫進行操作,當然也是增、刪、查、改、連接5大類操作。

instance按照實際修改,例如編輯student表,那么instance就是models.student代替。

3.1、增

            instance.objects.save()
instance.objects.create(username='張三',pwd='123456')
          

3.2、刪

            instance.objects.filter(username='張三').delete()
          

3.3、查

            instance.objects.all()
instance.objects.all().values('user')????#只取user列
instance.objects.all().values_list('id','user')????#取出id和user列,并生成一個列表
instance.objects.get(id=1)??#get返回的是對象
instance.objects.filter(id=1)??#filter是返回一個id=1的一整行,返回的值是一個序列。
          

3.4、改

            instance.objects.filter(username='zhangsan').update(pwd='123456')
          

3.5、連接

OCM的連接會比SQL更加方便,只要建立數據庫表的時候做好了foreign外鍵的連接,就會自動做好關聯,只需要輸入當前查詢的表格所直接關聯的表名雙下劃線字段名就可以了。例如當前查詢的是teacher表,那么與之直接關聯的是course表,所以可以filter對teacher表字段進行篩選,然后要返回的values,course的字段可以直接用course__sno來表示,而course表與score表做了關聯,所以如果要顯示score表的字段,需要用course__score_sno來表示。

            
              data = teacher.objects.filter(
              
                tusername
              
              =username).values(
              
                'course__cno'
              
              
                , 
              
              
                'course__cname'
              
              
                ,
                
'course__score__sno__sname' , 'course__score__cscore' ,
'course__score__sno__sno' )

懂得OCM操作數據庫后,我們可以開始動態網頁的開發工作了。


4、OCM操作數據庫

為了方便測試與掌握OCM操作數據庫技巧,我們現在models.py里面增加一張用戶名密碼表,用戶登錄頁面的操作。(后期不用這張表)

            testuser(models.Model):
????username?=?models.CharField(=)
????password?=?models.CharField(=)
          
            python?manage.py?makemigrations
python?manage.py?migrate
          

用navicat for mysql手工在testuser表里面創建一個測試用戶。

然后回到之間的index.html靜態文件里面,對于

表單標簽,增加method=‘POST’,表示按了表單提交按鈕之后,會將內容按照POST的方法發送到后端。

并且需要修改用戶名與密碼的input,加入name與id,分別叫username與password

              
              ?
            
?