Google Code Prettify

2018年10月14日 星期日

Python: ORM using Django

用 Python 寫資料庫程式,預設是以 ORM 的方式存取,這裡簡單的記錄如下:
  • 建立一個 application
  • 我是用 eclipse 開發 Python 程式,如上,我已經建立了一個命名為 myDb 的專案,Django 鼓勵在一個專案下建立多個 application,讓這些 application 方便共用資源,所以,開啟一個 console 畫面,進入專案的目錄,以我的情況來說,因為 myDb 建立在 D:\Project 目錄下,就進入 D:\Project\myDb 目錄。並於這個目錄下下以下指令:
    python manage.py startapp demo
    demo 是 application 名稱,執行上述指令後,在 D:\Project\myDb 目錄下,會建立一個名為 demo 的目錄,並產生一些預設的檔案,如下:
  • 安裝資料庫的驅動程式
  • 我用的資料庫是 MySQL,在繼續寫程式前,要先安裝 MySQL 的驅動程式,指令如下:
    pip install mysqlclient
  • 修改 settings.py
  • INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'demo',
    ]
    
    在 settings.py 中找到 INSTALLED_APPS,將剛剛建立的 demo application 加入,接下找到 DATABASES,如下輸入:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'Demo',
            'USER': 'myuser',
            'PASSWORD': 'p@ssw0rd',
            'HOST': '192.168.0.103',
            'PORT': '3306',
            'OPTIONS': {
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            },
        }
    }
  • 修改 models.py
  • # -*- encoding: utf-8 -*-
    from django.db import models
    
    class Maker(models.Model):
        name = models.CharField(max_length=10)
        country = models.CharField(max_length=10)
        
        def __str__(self):
            return self.name
    
    如上,在裡面加入一個類別 Maker,在下面的同步指令後,python 的工具會幫我們在資料庫中建立相關的 table。紅色部份是指示 python,資料庫中的字串用 utf-8 編碼。
  • 同步資料庫
  • python manage.py makemigrations
    python manage.py migrate
    
    在 D:\Project\myDb 目錄下,下上述兩個指令,python 就會在資料庫中建立相關的 table,如下:  
    這個 table 裡的欄位就如類別中定義的一樣,有 name 和 country,python 會自行加入一個自動編號的欄位當 key。
    python manage.py makemigrations 是用來建立資料庫和 Django 間的中介檔案。
    python manage.py migrate 則是同步更新資料庫的內容。
  • 測試
  • 我先在剛剛建立的 table 中新增一筆資料,如下:
    insert into demo_maker(name, country)
    values('ASUS', 'Taiwan');
    
    接著寫單元測試程式,將它查詢出來 … 修改 tests.py,如下:
    from django.test import TestCase
    
    import MySQLdb
    import unittest
    
    class DbTestCase(unittest.TestCase):
        def test_query(self):
            db = MySQLdb.connect(host="192.168.0.103", user="myuser", passwd="p@ssw0rd", db="demo")
            cursor = db.cursor()
            cursor.execute("select * from demo_maker")
            
            results = cursor.fetchall()
            for record in results:
                col0 = record[0]
                col1 = record[1]
                col2 = record[2]
                print(col0, col1, col2)
            
            db.close()
    
    很簡單的查詢後輸出到 console,看看是否正確 ... 測試的方式
    python manage.py test