Django框架的數據庫和模型

Django下配置使用 mysql 數據庫

  • 安裝 pymysql包
    $ sudo pip3 install pymysql

  • 安裝 mysql 客戶端(非必須)
    $ sudo pip3 install mysqlclient

  • 創建和配置數據庫

    • 創建數據庫
      create database 數據庫名 default charset utf8 collate utf8_general_ci;
      如:create database mywebdb default charset utf8 collate utf8_general_ci;

    • 數據庫的配置

      • sqlite 數據庫配置

        # file: settings.py
        DATABASES = {
            'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            }
        }
        
      • mysql 數據庫配置

        DATABASES = {
            'default' : {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'mywebdb',  # 數據庫名稱,需要自己定義
                'USER': 'root',
                'PASSWORD': 'root',  # 管理員密碼
                'HOST': '127.0.0.1',
                'PORT': 3306,
            }
        }
        
    • 關於數據庫的SETTING配置

      • ENGINE
        指定數據庫的後端引擎
        'django.db.backends.mysql'
        'django.db.backends.sqlite3'
        'django.db.backends.oracle'
        'django.db.backends.postgresql'
        
      • NAME 指定要連接的數據庫的名稱
        'NAME': 'mywebdb'
      • USER 指定登錄到數據庫的用戶名
        'USER':'root'
      • PASSWORD 接數據庫時使用的密碼。
        'PASSWORD':'123456'
      • HOST 連接數據庫時使用哪個主機。
        'HOST':'127.0.0.1'
      • PORT 連接數據庫時使用的端口。
        'PORT':'3306'
    • 添加 mysql 支持
      修改項目中__init__.py 加入如下內容來提供pymysql引擎的支持

      import pymysql
      pymysql.install_as_MySQLdb()
      

模型(Models)

  • 模型是一個Python類,它是由django.db.models.Model派生出的子類。
  • 一個模型類代表數據庫中的一張數據表
  • 模型類中每一個類屬性都代表數據庫中的一個字段。
  • 模型是數據交互的接口,是表示和操作數據庫的方法和方式

Django 的 ORM框架

  • ORM(Object Relational Mapping)即對象關係映射,它是一種程序技術,它允許你使用類和對象對數據庫進行操作,從而避免通過SQL語句操作數據庫
  • ORM框架的作用
    • 建立模型類和表之間的對應關係,通過面向對象的方式來操作數據庫。
    • 根據設計的模型類生成數據庫中的表格。
    • 通過簡單的配置就可以進行數據庫的切換。
  • ORM 好處:
    • 只需要面向對象編程, 不需要面向數據庫編寫代碼.
      • 對數據庫的操作都轉化成對類屬性和方法的操作.
      • 不用編寫各種數據庫的sql語句.
    • 實現了數據模型與數據庫的解耦, 屏蔽了不同數據庫操作上的差異.
      • 不在關注用的是mysql、oracle…等數據庫的內部細節.
      • 通過簡單的配置就可以輕鬆更換數據庫, 而不需要修改代碼.
  • ORM 缺點
    • 相比較直接使用SQL語句操作數據庫,有性能損失.
    • 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象, 在映射過程中有性能損失.
  • ORM 示意

在這裏插入圖片描述

  • 模型示例
    假設項目中已經添加了一個名爲bookstore的應用,現在爲該應用添加一個模型類代表圖書的信息。

    # file : bookstore/models.py
    from django.db import models
    
    class Book(models.Model):
      title = models.CharField("書名", max_length=50, default='')
      price = models.DecimalField('定價', max_digits=7, decimal_places=2, default=0.0)
    

    模型類名是數據表名的一部分,建議類名首字母大寫
    字段名又是當前類的類屬性名,此名稱將作爲數據表的字段名
    字段類型用來映射到數據表中的字段的類型
    字段選項爲這些字段提供附加的參數信息

  • 字段類型

    • BooleanField()
      數據庫類型:tinyint(1)
      編程語言中:使用True或False來表示值
      在數據庫中:使用1或0來表示具體的值

    • CharField()
      數據庫類型:varchar
      必須要指定max_length參數值

  • DateField()
    數據庫類型:date
    作用:表示日期
    編程語言中:使用字符串來表示具體值

    • 參數:
      DateField.auto_now: 每次保存對象時,自動設置該字段爲當前時間(取值:True/False)。
      DateField.auto_now_add: 當對象第一次被創建時自動設置當前時間(取值:True/False)。
      DateField.default: 設置當前時間(取值:字符串格式時間如: ‘2019-6-1’)。
      以上三個參數只能多選一
  • DateTimeField()
    數據庫類型:datetime(16)
    作用:表示日期和時間
    auto_now_add=True

  • DecimalField()
    數據庫類型:decimal(x,y)
    編程語言中:使用小數表示該列的值
    在數據庫中:使用小數

    • 參數:
      DecimalField.max_digits: 位數總數,包括小數點後的位數。 該值必須大於等於decimal_places.
      DecimalField.decimal_places: 小數點後的數字數量
    • 示例:
      money=models.DecimalField(
          max_digits=7,
          decimal_places=2,
          default=0.0
      )
      
  • FloatField()
    數據庫類型:double
    編程語言中和數據庫中都使用小數表示值

  • EmailField()

    • 數據庫類型:varchar
    • 編程語言和數據庫中使用字符串
  • IntegerField()
    數據庫類型:int
    編程語言和數據庫中使用整數

  • URLField()
    數據庫類型:varchar(200)
    編程語言和數據庫中使用字符串

  • ImageField()
    數據庫類型:varchar(100)
    作用:在數據庫中爲了保存圖片的路徑
    編程語言和數據庫中使用字符串

    • 示例:

      image=models.ImageField(
          upload_to="static/images"
      )
      
    • upload_to:指定圖片的上傳路徑
      在後臺上傳時會自動的將文件保存在指定的目錄下

  • TextField()
    數據庫類型:longtext
    作用:表示不定長的字符數據

參考文檔:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types

  • 字段選項FIELD_OPTIONS
    字段選項, 指定創建的列的額外的信息
    允許出現多個字段選項,多個選項之間使用,隔開
    • primary_key
      如果設置爲True,表示該列爲主鍵,如果指定一個字段爲主鍵,則此數庫表不會創建id字段

    • blank
      設置爲True時,字段可以爲空。設置爲False時,字段是必須填寫的。

    • null
      如果設置爲True,表示該列值允許爲空。
      默認爲False,如果此選項爲False建議加入default選項來設置默認值

    • default
      設置所在列的默認值,如果字段選項null=False建議添加此項

    • db_index
      如果設置爲True,表示爲該列增加索引

    • unique
      如果設置爲True,表示該字段在數據庫中的值必須是唯一(不能重複出現的)

    • db_column
      指定列的名稱,如果不指定的話則採用屬性名作爲列名

    • verbose_name
      設置此字段在admin界面上的顯示名稱。

    • 示例:

      # 創建一個屬性,表示用戶名稱,
      #長度30個字符,必須是唯一的,不能爲空,添加索引
      name = models.CharField(max_length=30, 
      	unique=True, null=False, db_index=True)
      

文檔參見:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options

數據庫遷移

建立好模型類後,需要進行數據庫遷移纔可以生成數據庫表。

  • 遷移步驟
    • 生成遷移文件
      $ python3 manager.py makemigrations
      執行後會在應用目錄下的migrations文件加下生成遷移文件
    • 執行遷移文件
      $ python3 manager.py migrate
      執行後會按照模型類的定義在數據庫生成對應的表。

注意:
每次修改模型類,都需要執行上面兩步遷移步驟,才能使數據庫更新。
頻繁的修改模型類,在遷移時候會更容易出現遷移失敗的問題。

數據庫遷移的錯誤處理方法

當執行 $ python3 manage.py makemigrations 出現如下遷移錯誤時的處理方法

  • 錯誤信息

    $ python3 manage.py makemigrations
    You are trying to change the nullable field 'title' on book to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
    Please select a fix:
    1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
    2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
    3) Quit, and let me add a default in models.py
    Select an option: 
    
  • 翻譯爲中文如下:

    $ python3 manage.py makemigrations
    您試圖將圖書上的可空字段“title”更改爲非空字段(沒有默認值);我們不能這樣做(數據庫需要填充現有行)。
    請選擇修復:
    1)現在提供一次性默認值(將對所有現有行設置此列的空值)
    2)暫時忽略,讓我自己處理空值的現有行(例如,因爲您在以前的數據遷移中添加了RunPython或RunSQL操作來處理空值)
    3)退出,讓我在models.py中添加一個默認值
    選擇一個選項:
    
  • 錯誤原因

    • 當將如下代碼
    class Book(models.Model):
        title = models.CharField("書名", max_length=50, null=True)
    
    • 去掉 null=True 改爲如下內容時會出現上述錯誤
    class Book(models.Model):
        title = models.CharField("書名", max_length=50)
    
    • 原理是 此數據庫的title 字段由原來的可以爲NULL改爲非NULL狀態,意味着原來這個字段可以不填值,現在改爲必須填定一個值,那填什麼值呢?此時必須添加一個缺省值。
  • 處理方法:

    • 選擇1 手動給出一個缺省值,在生成 bookstore/migrations/000x_auto_xxxxxxxx_xxxx.py 文件時自動將輸入的值添加到default參數中
    • 暫時忽略,以後用其它的命令處理缺省值問題(不推薦)
    • 退出當前生成遷移文件的過程,自己去修改models.py, 新增加一個default=XXX 的缺省值(推薦使用)
  • 數據庫的遷移文件混亂的解決辦法

    • 刪除所有 migrations 裏所有的 000?_XXXX.py (__init__.py除外)
    • 刪除數據庫 sql> drop database mywebdb;
    • 重新創建數據庫 sql> create datebase mywebdb default charset...;
    • 重新生成遷移文件 python3 manage.py makemigrations
    • 重新更新數據庫 python3 manage.py migrate
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章