Django學習筆記(3)--數據庫-1

數據庫:MySql 5.7html

下載:python

https://dev.mysql.com/downloads/windows/installer/5.7.html

python安裝Mysql的驅動mysql

pip install mysqlclient

固然除此以外還有pymysql等第三方驅動可使用,在這裏用的是mysqlclient。web

操做數據庫sql

Django配置鏈接數據庫:數據庫

在操做數據庫以前,首先先要鏈接數據庫。這裏咱們以配置MySQL爲例。Django鏈接數據庫,不須要單獨的建立一個鏈接對象。只須要在settings.py文件中作好數據庫相關的配置就能夠了。示例:django

DATABASES = {
    'default':{
        #數據庫引擎
        'ENGINE': 'django.db.backends.mysql',
        #數據庫名字
        'NAME': 'name',
        #鏈接數據庫的用戶名
        'USER': 'username',
        #用戶密碼
        'PASSWORD': '********',
        #mysql的主機地址
        'HOST': 'ip_address',
        #端口
        'PORT': 'port'
    }
}

 在Django操做數據庫:windows

操做方式有兩種:api

  1. 原生sql語句
  2. ORM模型

1.原生sql語句安全

在Django中使用原生的sql語句操做其實就是使用python ad api的接口來操做。若是使用的是mysqlclient驅動,那麼就是用mysqlclient來操做的,只不過Django將數據庫鏈接這一部分封裝好了,咱們只要在settings.py中配置好了數據庫鏈接信息後直接使用Django封裝好的接口就能夠操做了。示例:

#使用django封裝好的connection對象,會自動選取settings.py中數據庫的配置信息
from django.db import connection

#獲取遊標對象
cursor = connection.cursor()
#拿到遊標對象後執行sql語句
cursor.execute("select * from book")
#獲取全部數據
rows = cursor.fetchall()
#遍歷查詢到的數據
for row in rows:
    print(row)

附:Python DB API 規範下cursor對象經常使用接口:

1.description:若是cursor執行了查詢的sql代碼,那麼讀取cursor.description屬性的時候,將返回一個列表,這個列表中裝的是元組,元組中裝的分別是(name,type_code,display_size,internal_size,precision,scale,null_ok),其中name表明的是查詢出來的元素的字段名稱,其餘參數暫時用處不大。

2.rowcount:表明的是在執行了sql語句後受影響的行數。

3.close:關閉遊標。關閉遊標之後就不能使用了,不然會拋出異常。

4.execute(sql[,parameters]):執行某個sql語句。若是在執行sql語句的時候還須要傳遞參數,那麼能夠傳給parameters參數。示例:

cursor.execute("select * from article where id=%s",(1,))

5.fetchone:在執行了查詢操做後,獲取第一條數據

6.fetchmany(size):獲取多條查詢到的數據

7.fetchall:獲取全部查詢到的數據

2.ORM模型

 着項目愈來愈大,採用寫原生sql的方式在代碼中會出現大量的SQL語句,那麼問題就出現了:

  • SQL語句重複利用率不高, 越複雜的SQL語句條件越多,代碼越長,會出現不少相近的SQL語句。
  • 不少SQL語句是在業務邏輯中拼出來的,若是有數據庫須要更改,就要去修改這些邏輯,這會很容易漏掉對某些SQL語句的修改。
  • 寫SQL時容易忽略web安全問題,給將來形成隱患。SQL注入。

ORM,全稱Object Relational Mapping,中文叫作對象關係映射,經過ORM咱們能夠經過類的方式去操做數據庫,而不用再寫原生的SQL語句。經過把表映射成類,把行做實例,把字段作屬性,ORM在執行對象操做的時候最終仍是會把對應的操做轉換爲數據庫的原生語句。使用ORM有許多優勢:

  • 易用性:使用ORM作數據庫的開發能夠有效的減小重複SQL語句的機率,寫出來的模型也更加直觀、清晰。
  • 性能損耗小:ORM轉換成底層數據庫操做指令確實會有一些開銷。但從實際的狀況來看,這種性能損耗很小,只要不是對性能有嚴苛的要求,綜合考慮開發效率,代碼的閱讀性,帶來的好處要遠遠大於性能損耗,而項目越大做用越明顯。
  • 設計靈活:能夠輕鬆的寫出複雜的查詢。
  • 可移植性:Django封裝了底層的數據庫實現,支持多個關係數據庫引擎。能夠很是輕鬆的切換數據庫。

 

 

 

 

 

ORM模型的建立和映射:

1.建立ORM模型:

‘ORM’模型通常都是放在'app'的'models.py'文件中,每一個'app'均可以擁有本身的模型,而且若是這個模型想要映射到數據庫中,那麼這個'app'必需要放在'settings.py'的'INSTALLED_APP'中進行安裝,如下是寫一個簡單的數據'ORM'模型。示例:

from django.db import models class Book(models.Model): name=models.CharField(max_length=20,null=False) author=models.CharField(max_length=20,null=False) pub_time=models.DateTimeField(default=datetime.now) price=models.FloatField(default=0)

以上便定義了一個模型。這個模型繼承自'django.db.models.Model',若是這個模型想要映射到數據庫中,就必須繼承自這個類,這個模型之後映射到數據庫中,表名是模型名稱的小寫形式,爲'book'。在這個表中,有四個字段,一個爲'name',這個字段是保存的是書的名稱,是'varchar'類型,最長不能超過20個字符,而且不能爲空。第二個字段是……

若是沒有定義主鍵,那麼將會自動生成一個自動增加的'int'類型的主鍵,而且這個主鍵的名字叫作'id'。

 

2.映射模型到數據庫中:

將'ORM'模型映射到數據庫中,總結起來有如下幾步:

1.在'settings.py'文件中,配置好'DATABASES',作好數據庫相關配置。

2.在'app'中的'models.py'中定義好魔性,這個模型必須繼承自'django.db.models'。

3.將這個'app'添加到'settings.py'中的'INSTALLED_APP'中。

4.在終端進入項目所在路徑,而後執行'python manage.py makemigrations'來生成遷移腳本文件。

5.接着執行'python manage.py migrate'來遷移腳本文件映射到數據庫中。

 

 

 

 

 

 

 

 

ORM模型基本增刪改查操做

1.添加數據:

只要使用ORM模型建立一個對象,而後再調用這個ORM模型的'save'方法就能夠保存了。

示例:

book = Book(name='西遊記',author='吳承恩',price=100)
book.save()

2.查找數據:

全部的查找工做都是使用模型上的'objects'屬性來完成的,固然也能夠試用自定義查詢對象.

1.根據主鍵進行查找:使用主鍵進行查找,能夠試用'objects.get'方法,而後傳遞'pk=xx'的方式進行查找。示例:

book = Book.objects.get(pk=2)

2.根據其餘字段進行查找:可使用'objects.filter'方法進行查找。示例:

book = Book.objects.filter(name='三國演義')

使用'filter'方法返回來的是一個'QuerySet'對象。這個對象相似於列表。咱們可使用這個對象的'first'方法來獲取第一個值。

3.刪除數據:

首先查找到對應的數據模型。而後再執行這個模型的'delete'方法便可。示例:

book = Book.objects.get(pk=1)
book.delete()

4.修改數據:

首先查找到對應的數據模型。而後修改這個模型上的屬性的值。再執行'save'方法便可修改完成。示例:

book = Book.objects.get(pk=2)
book.price=200
book.save()

 

 

 

 

 

 

 

 

模型經常使用屬性

經常使用字段:

在Django中,定義了一些Field來與數據庫表中的字段類型來進行映射。

  • AutoField:

映射到數據庫中是int類型,能夠由自動增加的特性。通常不須要使用這個類型,若是不指定主鍵,那麼模型就會自動生成一個叫id的自動增加的主鍵。若是你想指定一個其它名字的而且具備自動增加的主鍵,使用AutoField也是能夠的(primary_key=True)。

  • BigAutoField:

64位的整型,相似於AutoField,只不過是產生的數據範圍是從1-9223372036854775807

  • BooleanField:

在模型層接收的是True/False。在數據庫層面是tinyint類型。若是沒有指定默認值,默認值是None。

  • CharField:

在數據庫層面是varchar類型。在python層面就是普通的字符串。這個類型在使用的時候必需要指定最大的長度,也即必需要傳遞max_length這個關鍵字參數進去。

  • DateField:

日期類型。在python中是datetime.date類型,能夠記錄年月日。在映射到數據庫中也是date類型,使用這個Field能夠傳遞一下幾個參數:

  1. aotu_now:在每次這個數據庫保存的時候,都是用當前的時間。若是做爲一個記錄修改日期的字段,能夠將這個屬性設置爲True。
  2. auto_now_add:在每次數據第一次被添加進去的時候,都是用當前的時間。好比做爲一個記錄第一次入庫的字段,能夠將這個屬性設置爲True。
  • DateTimeField:

日期時間類型,相似於DateField。不只僅能夠存儲日期,還能夠存儲時間。映射到數據庫中是datetime類型。這個Field也可使用auto_now和auto_now_add兩個屬性。

  • TimeField:

時間類型。在數據庫中是time類型。在Python中是datetime.time類型。

  • EmailField:

相似於CharField。在數據庫底層也是一個varchar類型。只不過這個Field能夠存儲字符串的時候檢測這個字符串是不是一個有效的郵箱。最大長度是254個字符。

  • FileField:

用來存儲文件的。(待補充)

  • ImageField:

用來存儲圖片文件。(待補充)

  • FloatField:

浮點類型。映射到數據庫中是float類型。

  • IntegerField:

整型。-2147483647~2147483647

  • BigIntegerField:

大整型。

  • PositiveIntegerField:

正整型。0~2147483647

  • SmallIntegerFlied:

小整型。-32768~32768

  • TextField:

大量的文本類型。映射到數據庫中是longtext類型。

  • UUIDField:

只能存儲uuid格式的字符串。uuid是一個32位的全球惟一的字符串,通常用來做爲主鍵。

  • URLField:

相似於CharField,只不過只能用來存儲url格式的字符串。默認max_length是200。

相關文章
相關標籤/搜索